/ Hex Artifact Content
Login

Artifact 11945da2e526b6f02a7c24aaf7136adb131aefe9:


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 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
3110: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
3120: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
3130: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
3140: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
3150: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
3160: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
3170: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
3180: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
3190: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
31a0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
31b0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
31c0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
31d0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
31e0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
31f0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3200: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3210: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3220: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3230: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3240: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3250: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
3260: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
3270: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
3280: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
3290: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
32a0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
32b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
32c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
32e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
32f0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3300: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3310: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3320: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3330: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3340: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3350: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
3360: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
3370: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
3380: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
3390: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
33c0: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
33d0: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
33e0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
33f0: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3400: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3410: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3420: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3430: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3440: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3450: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3460: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3470: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3480: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3490: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
34a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
34b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
34c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
34d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
34f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3500: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3510: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3520: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3530: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3540: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3550: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
3560: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
3570: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
3580: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
3590: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
35a0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
35b0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
35c0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
35d0: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
35e0: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
35f0: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3600: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3610: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3620: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3630: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3640: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3650: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
3660: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3670: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
3680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3690: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
36a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
36b0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
36c0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
36d0: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
36e0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
36f0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3700: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3710: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3720: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3730: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3740: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3750: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
3760: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
3770: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
3780: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
3790: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
37a0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
37b0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
37c0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
37d0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
37e0: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
37f0: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3800: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3810: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3820: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3830: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3840: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3850: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
3860: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
3870: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
3880: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
3890: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
38a0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
38b0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
38c0: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
38d0: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
38e0: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
38f0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3900: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3910: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3920: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3930: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3940: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3950: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
3960: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3970: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
3980: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
3990: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
39a0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
39b0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
39c0: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
39d0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
39e0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
39f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3a00: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3a10: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3a20: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3a30: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3a40: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3a50: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3a60: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3a70: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3a80: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
3a90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
3aa0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
3ab0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3ac0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3ad0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3ae0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3af0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3b00: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3b10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3b20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3b30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3b40: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3b50: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3b60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3b70: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
3b80: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
3b90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ba0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
3bb0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3bc0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3bd0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3be0: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3bf0: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3c00: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3c10: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3c20: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3c30: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3c40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3c50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3c70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3c80: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3c90: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ca0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3cb0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3cc0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3cd0: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3ce0: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3cf0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3d00: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d10: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3d20: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3d30: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3d40: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3d50: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3d60: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3d70: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3d80: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3d90: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3da0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3db0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3dc0: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3dd0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3de0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3df0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3e00: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3e10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3e20: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3e30: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3e40: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3e50: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3e60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3e70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3e80: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3e90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ea0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3eb0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3ec0: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3ed0: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3ee0: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3ef0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3f00: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3f10: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3f20: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3f30: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3f40: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3f50: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3f60: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3f70: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3f80: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3f90: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3fa0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3fb0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3fc0: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3fd0: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3fe0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3ff0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
4000: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
4010: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
4020: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
4030: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
4040: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
4050: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
4060: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
4070: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
4080: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
4090: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
40a0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
40b0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
40c0: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
40d0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
40e0: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
40f0: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
4100: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
4110: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
4120: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
4130: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
4140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4150: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
4160: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
4170: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
4180: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
4190: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
41a0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
41b0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
41c0: 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20   *p;.  BtShared 
41d0: 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70  *pBt = pBtree->p
41e0: 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
41f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4200: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4210: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
4220: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4230: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4240: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4250: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 0a 20  F_Incrblob)!=0. 
4260: 20 20 20 20 26 26 20 28 69 73 43 6c 65 61 72 54      && (isClearT
4270: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
4280: 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20  nKey==iRow).    
4290: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61  ){.      p->eSta
42a0: 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
42b0: 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  LID;.    }.  }.}
42c0: 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75  ..#else.  /* Stu
42d0: 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20  b function when 
42e0: 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74  INCRBLOB is omit
42f0: 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65  ted */.  #define
4300: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4310: 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a  lobCursors(x,y,z
4320: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
4330: 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
4340: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62   */../*.** Set b
4350: 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42  it pgno of the B
4360: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4370: 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69 73  ent bitvec. This
4380: 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77   is called .** w
4390: 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74 20  hen a page that 
43a0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61  previously conta
43b0: 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65  ined data become
43c0: 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  s a free-list le
43d0: 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a  af .** page..**.
43e0: 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64 2e  ** The BtShared.
43f0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4400: 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72  ec exists to wor
4410: 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63  k around an obsc
4420: 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65  ure.** bug cause
4430: 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61 63  d by the interac
4440: 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66  tion of two usef
4450: 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69  ul IO optimizati
4460: 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a  ons surrounding.
4470: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  ** free-list lea
4480: 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  f pages:.**.**  
4490: 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74   1) When all dat
44a0: 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f  a is deleted fro
44b0: 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68 65  m a page and the
44c0: 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a   page becomes.**
44d0: 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73        a free-lis
44e0: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
44f0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69   page is not wri
4500: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61  tten to the data
4510: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73  base.**      (as
4520: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4530: 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f  pages contain no
4540: 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61   meaningful data
4550: 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20  ). Sometimes.** 
4560: 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67 65       such a page
4570: 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75   is not even jou
4580: 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77  rnalled (as it w
4590: 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66  ill not be modif
45a0: 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79  ied,.**      why
45b0: 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c   bother journall
45c0: 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ing it?)..**.** 
45d0: 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65 65    2) When a free
45e0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
45f0: 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20 63  is reused, its c
4600: 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65  ontent is not re
4610: 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
4620: 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20  the database or 
4630: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
4640: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79  ournal file (why
4650: 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20   should it.**   
4660: 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73 20     be, if it is 
4670: 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69  not at all meani
4680: 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42  ngful?)..**.** B
4690: 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68  y themselves, th
46a0: 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ese optimization
46b0: 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20  s work fine and 
46c0: 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a  provide a handy.
46d0: 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ** performance b
46e0: 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c  oost to bulk del
46f0: 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70  ete or insert op
4700: 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65  erations. Howeve
4710: 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20  r, if.** a page 
4720: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
4730: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68  free-list and th
4740: 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69 6e  en reused within
4750: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61   the same.** tra
4760: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62  nsaction, a prob
4770: 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66  lem comes up. If
4780: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
4790: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
47a0: 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20  .** it is moved 
47b0: 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
47c0: 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20   and it is also 
47d0: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
47e0: 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74  hen it.** is ext
47f0: 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
4800: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65  free-list and re
4810: 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f  used, then the o
4820: 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20  riginal data.** 
4830: 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20  may be lost. In 
4840: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72  the event of a r
4850: 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20  ollback, it may 
4860: 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  not be possible.
4870: 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
4880: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
4890: 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69  s original confi
48a0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  guration..**.** 
48b0: 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20  The solution is 
48c0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
48d0: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
48e0: 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67 65   Whenever a page
48f0: 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f   is .** moved to
4900: 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c   become a free-l
4910: 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74  ist leaf page, t
4920: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
4930: 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69   bit is.** set i
4940: 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57 68  n the bitvec. Wh
4950: 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70 61  enever a leaf pa
4960: 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ge is extracted 
4970: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
4980: 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  st,.** optimizat
4990: 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f  ion 2 above is o
49a0: 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63 6f  mitted if the co
49b0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
49c0: 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65  is already.** se
49d0: 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48  t in BtShared.pH
49e0: 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63  asContent. The c
49f0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
4a00: 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72 65  itvec are cleare
4a10: 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  d.** at the end 
4a20: 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61 63  of every transac
4a30: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
4a40: 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73 43  int btreeSetHasC
4a50: 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20  ontent(BtShared 
4a60: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
4a70: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4a80: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
4a90: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4aa0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4ab0: 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20  gno<=pBt->nPage 
4ac0: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73  );.    pBt->pHas
4ad0: 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65  Content = sqlite
4ae0: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 42  3BitvecCreate(pB
4af0: 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69  t->nPage);.    i
4b00: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
4b10: 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
4b20: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
4b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4b40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4b50: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4b60: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4b70: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4b80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4b90: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4ba0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4bb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4bc0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4bd0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4be0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4bf0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4c00: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4c10: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4c20: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4c30: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4c40: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4c50: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4c60: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4c70: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4c80: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4c90: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4ca0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4cb0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4cc0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4cd0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ce0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4cf0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4d00: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4d10: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4d20: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4d30: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4d40: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4d50: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4d60: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4d70: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4d80: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4d90: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4da0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4db0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4dc0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4dd0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4de0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
4df0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
4e00: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4e10: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
4e20: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
4e30: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
4e40: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
4e50: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
4e60: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
4e70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
4e80: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
4e90: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
4ea0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
4eb0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
4ec0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
4ed0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
4ee0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
4ef0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
4f00: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
4f10: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
4f20: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
4f30: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
4f40: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
4f50: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
4f60: 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  1;.}.../*.** Sav
4f70: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
4f80: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e  rsor position in
4f90: 20 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42   the variables B
4fa0: 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a  tCursor.nKey .**
4fb0: 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b   and BtCursor.pK
4fc0: 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73  ey. The cursor's
4fd0: 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
4fe0: 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
4ff0: 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  EEK..**.** The c
5000: 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
5010: 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
5020: 72 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20  r is valid (has 
5030: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
5040: 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74  ALID).** prior t
5050: 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
5060: 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61  outine.  .*/.sta
5070: 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73  tic int saveCurs
5080: 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72  orPosition(BtCur
5090: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
50a0: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
50b0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
50c0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
50d0: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
50e0: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
50f0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5100: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
5110: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5120: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
5130: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
5140: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
5150: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
5160: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
5170: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
5180: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
5190: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
51a0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
51b0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
51c0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
51d0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
51e0: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
51f0: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5200: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5210: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5220: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5230: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5240: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5250: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
5260: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
5270: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
5280: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
5290: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20  ey .  ** data.. 
52a0: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75   */.  if( 0==pCu
52b0: 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
52c0: 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64  tKey ){.    void
52d0: 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33   *pKey = sqlite3
52e0: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
52f0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
5300: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
5310: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
5320: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5330: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5340: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5350: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5360: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5370: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5380: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5390: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
53a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
53b0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
53c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
53d0: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
53e0: 20 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   !pCur->apPage[0
53f0: 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43  ]->intKey || !pC
5400: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69  ur->pKey );..  i
5410: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5420: 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c   ){.    btreeRel
5430: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5440: 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43  es(pCur);.    pC
5450: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
5460: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b  SOR_REQUIRESEEK;
5470: 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61  .  }..  invalida
5480: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
5490: 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
54a0: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
54b0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
54c0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
54d0: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
54e0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
54f0: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
5500: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
5510: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
5520: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
5530: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
5540: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
5550: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
5560: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
5570: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
5580: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
5590: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
55a0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
55b0: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
55c0: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
55d0: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
55e0: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
55f0: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
5600: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
5610: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
5620: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
5630: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
5640: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
5650: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
5660: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
5670: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
5680: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
5690: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
56a0: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
56b0: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
56c0: 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f  n note:  This ro
56d0: 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65  utine merely che
56e0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
56f0: 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65  y cursors.** nee
5700: 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20  d to be saved.  
5710: 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20  It calls out to 
5720: 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73  saveCursorsOnLis
5730: 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73  t() in the (unus
5740: 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68  ual).** event th
5750: 61 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69  at cursors are i
5760: 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20  n need to being 
5770: 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  saved..*/.static
5780: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
5790: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
57a0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
57b0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
57c0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
57d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
57e0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
57f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
5800: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
5810: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
5820: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
5830: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
5840: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
5850: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
5860: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
5870: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
5880: 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b  =iRoot) ) break;
5890: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20  .  }.  return p 
58a0: 3f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  ? saveCursorsOnL
58b0: 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45  ist(p, iRoot, pE
58c0: 78 63 65 70 74 29 20 3a 20 53 51 4c 49 54 45 5f  xcept) : SQLITE_
58d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
58e0: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
58f0: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
5900: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
5910: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
5920: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
5930: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
5940: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
5950: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
5960: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
5970: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
5980: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
5990: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
59a0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
59b0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
59c0: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
59d0: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
59e0: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
59f0: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
5a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
5a10: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5a20: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5a30: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
5a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
5a50: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
5a60: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
5a70: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
5a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
5a90: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
5aa0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
5ab0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
5ac0: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
5ad0: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
5ae0: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
5af0: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
5b00: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5b10: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5b20: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
5b30: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
5b40: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
5b50: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
5b60: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
5b70: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
5b80: 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69  on(p);.        i
5b90: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
5ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
5bb0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
5bc0: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
5bd0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
5be0: 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  ( p->iPage>0 );.
5bf0: 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c          btreeRel
5c00: 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
5c10: 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  es(p);.      }. 
5c20: 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
5c30: 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28  pNext;.  }while(
5c40: 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53   p );.  return S
5c50: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5c60: 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72  ** Clear the cur
5c70: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
5c80: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
5c90: 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
5ca0: 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
5cb0: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
5cc0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5cd0: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
5ce0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
5cf0: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
5d00: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
5d10: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
5d20: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
5d30: 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69  ** In this versi
5d40: 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74  on of BtreeMovet
5d50: 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63  o, pKey is a pac
5d60: 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ked index record
5d70: 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67  .** such as is g
5d80: 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
5d90: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
5da0: 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68  code.  Unpack th
5db0: 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20  e.** record and 
5dc0: 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d  then call BtreeM
5dd0: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20  ovetoUnpacked() 
5de0: 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a  to do the work..
5df0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
5e00: 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43  reeMoveto(.  BtC
5e10: 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
5e20: 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20   /* Cursor open 
5e30: 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20  on the btree to 
5e40: 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20  be searched */. 
5e50: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
5e60: 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b  y,   /* Packed k
5e70: 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20  ey if the btree 
5e80: 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20  is an index */. 
5e90: 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20   i64 nKey,      
5ea0: 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20       /* Integer 
5eb0: 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20  key for tables. 
5ec0: 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f   Size of pKey fo
5ed0: 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  r indices */.  i
5ee0: 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20  nt bias,        
5ef0: 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63     /* Bias searc
5f00: 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e  h to the high en
5f10: 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  d */.  int *pRes
5f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
5f30: 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c  ite search resul
5f40: 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ts here */.){.  
5f50: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
5f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
5f70: 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55  atus code */.  U
5f80: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
5f90: 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70  IdxKey;   /* Unp
5fa0: 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
5fb0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65  */.  char aSpace
5fc0: 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [200];          
5fd0: 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f  /* Temp space fo
5fe0: 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61  r pIdxKey - to a
5ff0: 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f  void a malloc */
6000: 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d  .  char *pFree =
6010: 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   0;..  if( pKey 
6020: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
6030: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
6040: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
6050: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
6060: 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63  AllocUnpackedRec
6070: 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43 75  ord(.        pCu
6080: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70  r->pKeyInfo, aSp
6090: 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
60a0: 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20  ce), &pFree.    
60b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
60c0: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
60d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
60e0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
60f0: 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70  rdUnpack(pCur->p
6100: 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b  KeyInfo, (int)nK
6110: 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65  ey, pKey, pIdxKe
6120: 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  y);.    if( pIdx
6130: 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29  Key->nField==0 )
6140: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
6150: 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  bFree(pCur->pKey
6160: 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29  Info->db, pFree)
6170: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
6180: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
6190: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  PT;.    }.  }els
61a0: 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  e{.    pIdxKey =
61b0: 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   0;.  }.  rc = s
61c0: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
61d0: 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20  oUnpacked(pCur, 
61e0: 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62  pIdxKey, nKey, b
61f0: 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66  ias, pRes);.  if
6200: 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73  ( pFree ){.    s
6210: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6220: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6230: 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72   pFree);.  }.  r
6240: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6250: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
6260: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
6270: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
6280: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
6290: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
62a0: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
62b0: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
62c0: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
62d0: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
62e0: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
62f0: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
6300: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
6310: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
6320: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
6330: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
6340: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
6350: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
6360: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
6370: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
6380: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74  ition()..*/.stat
6390: 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73 74  ic int btreeRest
63a0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
63b0: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
63c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
63d0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
63e0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
63f0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6400: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6410: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6420: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6430: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6440: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6450: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
6460: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
6470: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
6480: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
6490: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
64a0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
64b0: 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b  ey, 0, &pCur->sk
64c0: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
64d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
64e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
64f0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6500: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
6510: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
6520: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6530: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
6540: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6550: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
6560: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
6570: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
6580: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6590: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
65a0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
65b0: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
65c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
65d0: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
65e0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
65f0: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
6600: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
6610: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
6620: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
6630: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6640: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
6650: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
6660: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
6670: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
6680: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
6690: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
66a0: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
66b0: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
66c0: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
66d0: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
66e0: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
66f0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
6700: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
6710: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
6720: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
6730: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
6740: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
6750: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
6760: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
6770: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
6780: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
6790: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
67a0: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
67b0: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
67c0: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
67d0: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
67e0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
67f0: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
6800: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
6810: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
6820: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
6830: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
6840: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
6850: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
6860: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
6870: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
6880: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
6890: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
68a0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
68b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
68c0: 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61  utine restores a
68d0: 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20   cursor back to 
68e0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73  its original pos
68f0: 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a  ition after it.*
6900: 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64  * has been moved
6910: 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65   by some outside
6920: 20 61 63 74 69 76 69 74 79 20 28 73 75 63 68 20   activity (such 
6930: 61 73 20 61 20 62 74 72 65 65 20 72 65 62 61 6c  as a btree rebal
6940: 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77  ance or.** a row
6950: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c   having been del
6960: 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
6970: 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e  der the cursor).
6980: 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63    .**.** On succ
6990: 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65  ess, the *pDiffe
69a0: 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65  rentRow paramete
69b0: 72 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  r is false if th
69c0: 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
69d0: 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  .** pointing at 
69e0: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
69f0: 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e   row.  *pDiffern
6a00: 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20  tRow is the row 
6a10: 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
6a20: 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61  s pointing to ha
6a30: 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20  s been deleted, 
6a40: 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75 72 73  forcing the curs
6a50: 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73  or to point to s
6a60: 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f  ome.** nearby ro
6a70: 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  w..**.** This ro
6a80: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
6a90: 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20  y be called for 
6aa0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75  a cursor that ju
6ab0: 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54  st returned.** T
6ac0: 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  RUE from sqlite3
6ad0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6ae0: 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ved()..*/.int sq
6af0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
6b00: 52 65 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72  Restore(BtCursor
6b10: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69   *pCur, int *pDi
6b20: 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69  fferentRow){.  i
6b30: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6b40: 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61  ( pCur!=0 );.  a
6b50: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6b60: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
6b70: 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  D );.  rc = rest
6b80: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6b90: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
6ba0: 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65  c ){.    *pDiffe
6bb0: 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20  rentRow = 1;.   
6bc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6bd0: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6be0: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6bf0: 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
6c00: 73 6b 69 70 4e 65 78 74 21 3d 30 29 20 29 7b 0a  skipNext!=0) ){.
6c10: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
6c20: 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ow = 1;.  }else{
6c30: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
6c40: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
6c50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6c60: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6c70: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
6c80: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
6c90: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
6ca0: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
6cb0: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
6cc0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
6cd0: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
6ce0: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
6cf0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
6d00: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
6d10: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
6d20: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
6d30: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
6d40: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
6d50: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
6d60: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
6d70: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6d80: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
6d90: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
6da0: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
6db0: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
6dc0: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
6dd0: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
6de0: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
6df0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
6e00: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
6e10: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
6e20: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
6e30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6e40: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
6e50: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
6e60: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
6e70: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
6e80: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
6e90: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
6ea0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
6eb0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
6ec0: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
6ed0: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
6ee0: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
6ef0: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
6f00: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
6f10: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
6f20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
6f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
6f40: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
6f50: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
6f60: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6f70: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
6f80: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
6f90: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
6fa0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
6fb0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
6fc0: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
6fd0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
6fe0: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
6ff0: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
7000: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
7010: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
7020: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
7030: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
7040: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7050: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
7060: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
7070: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
7080: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
7090: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
70a0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
70b0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
70c0: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
70d0: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
70e0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
70f0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7100: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
7110: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
7120: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7130: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
7140: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
7150: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7160: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
7170: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7180: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
7190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
71a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
71b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
71c0: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
71d0: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
71e0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
71f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7200: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7210: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
7220: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
7230: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
7240: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
7250: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
7260: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
7270: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
7280: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
7290: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
72a0: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
72b0: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
72c0: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
72d0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
72e0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
72f0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7300: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7310: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
7320: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
7330: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
7340: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
7350: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
7360: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
7370: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7380: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7390: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
73a0: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
73b0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
73c0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
73d0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
73e0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
73f0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7400: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7410: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7420: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7430: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7440: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7450: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7460: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7470: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7480: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7490: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
74a0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
74b0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
74c0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
74d0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
74e0: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
74f0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7500: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7510: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7520: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7530: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7540: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7550: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7560: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7570: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7580: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7590: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
75a0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
75b0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
75c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
75d0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
75e0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
75f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7600: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7610: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7620: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7630: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7640: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7650: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
7660: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
7670: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
7680: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
7690: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
76a0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
76b0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
76c0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
76d0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
76e0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
76f0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7700: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7710: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7720: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7730: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7740: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7750: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
7760: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
7770: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
7780: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
7790: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
77a0: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
77b0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
77c0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
77d0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
77e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
77f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7800: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7810: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7820: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7830: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7840: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7850: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
7860: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
7870: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
7880: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7890: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
78a0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
78b0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
78c0: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
78d0: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
78e0: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
78f0: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7900: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7910: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7920: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7930: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7940: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7950: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7960: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7970: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
7980: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
7990: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
79a0: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
79b0: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
79c0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
79d0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
79e0: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
79f0: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7a00: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
7a10: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
7a20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7a30: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
7a40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7a50: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
7a60: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
7a70: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
7a80: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
7a90: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
7aa0: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
7ab0: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
7ac0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
7ad0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
7ae0: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
7af0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
7b00: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
7b10: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
7b20: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
7b30: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
7b40: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
7b50: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
7b60: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
7b70: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
7b80: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
7b90: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tent..**.** This
7ba0: 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f   routine works o
7bb0: 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68  nly for pages th
7bc0: 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69  at do not contai
7bd0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
7be0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e  ..*/.#define fin
7bf0: 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28  dCell(P,I) \.  (
7c00: 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50  (P)->aData + ((P
7c10: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
7c20: 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 43 65  t2byte(&(P)->aCe
7c30: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
7c40: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
7c50: 76 32 28 44 2c 4d 2c 4f 2c 49 29 20 28 44 2b 28  v2(D,M,O,I) (D+(
7c60: 4d 26 67 65 74 32 62 79 74 65 28 44 2b 28 4f 2b  M&get2byte(D+(O+
7c70: 32 2a 28 49 29 29 29 29 29 0a 0a 0a 2f 2a 0a 2a  2*(I))))).../*.*
7c80: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
7c90: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
7ca0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
7cb0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
7cc0: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
7cd0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
7ce0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  ls..*/.static u8
7cf0: 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65   *findOverflowCe
7d00: 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
7d10: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
7d20: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
7d30: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7d40: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7d50: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
7d60: 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  (i=pPage->nOverf
7d70: 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  low-1; i>=0; i--
7d80: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
7d90: 20 20 6b 20 3d 20 70 50 61 67 65 2d 3e 61 69 4f    k = pPage->aiO
7da0: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  vfl[i];.    if( 
7db0: 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k<=iCell ){.    
7dc0: 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29    if( k==iCell )
7dd0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7de0: 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 69   pPage->apOvfl[i
7df0: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
7e00: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
7e10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
7e20: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
7e30: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
7e40: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
7e50: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
7e60: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
7e70: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
7e80: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
7e90: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
7ea0: 66 75 6e 63 74 69 6f 6e 2e 20 20 62 74 72 65 65  function.  btree
7eb0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
7ec0: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
7ed0: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
7ee0: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 62 74   argument and bt
7ef0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7f00: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
7f10: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
7f20: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
7f30: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
7f40: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
7f50: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
7f60: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
7f70: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
7f80: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
7f90: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
7fa0: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
7fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
7fc0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
7fd0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
7fe0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7ff0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8000: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8010: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
8020: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8030: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
8040: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
8050: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
8060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8070: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
8080: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
8090: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
80a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
80b0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
80c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
80d0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20  age->leaf==0 || 
80e0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29  pPage->leaf==1 )
80f0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
8100: 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
8110: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8120: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20  childPtrSize==0 
8130: 29 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 70  );.    pIter = p
8140: 43 65 6c 6c 20 2b 20 67 65 74 56 61 72 69 6e 74  Cell + getVarint
8150: 33 32 28 70 43 65 6c 6c 2c 20 6e 50 61 79 6c 6f  32(pCell, nPaylo
8160: 61 64 29 3b 0a 20 20 20 20 70 49 74 65 72 20 2b  ad);.    pIter +
8170: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
8180: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
8190: 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 20  >nKey);.  }else 
81a0: 69 66 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  if( pPage->noPay
81b0: 6c 6f 61 64 20 29 7b 0a 20 20 20 20 61 73 73 65  load ){.    asse
81c0: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
81d0: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
81e0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
81f0: 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26   4 + getVarint(&
8200: 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29  pCell[4], (u64*)
8210: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
8220: 20 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f     pInfo->nPaylo
8230: 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66  ad = 0;.    pInf
8240: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20  o->nLocal = 0;. 
8250: 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66     pInfo->iOverf
8260: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e  low = 0;.    pIn
8270: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
8280: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
8290: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
82a0: 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65   = pCell + pPage
82b0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
82c0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
82d0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
82e0: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
82f0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
8300: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
8310: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
8320: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
8330: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
8340: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
8350: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
8360: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
8370: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
8380: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
8390: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
83a0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
83b0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
83c0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
83d0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
83e0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
83f0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
8400: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
8410: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
8420: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
8430: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
8440: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
8450: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
8460: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
8470: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
8480: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
8490: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
84a0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
84b0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
84c0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
84d0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
84e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
84f0: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
8500: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
8510: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
8520: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
8530: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
8540: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
8550: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
8560: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
8570: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
8580: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
8590: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
85a0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
85b0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
85c0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
85d0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
85e0: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
85f0: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8600: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
8610: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8620: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
8630: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
8640: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
8650: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
8660: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
8670: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
8680: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
8690: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
86a0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
86b0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
86c0: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
86d0: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
86e0: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
86f0: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
8700: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
8710: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
8720: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
8730: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
8740: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8750: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8760: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8770: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
8780: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
8790: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
87a0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
87b0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
87c0: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
87d0: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
87e0: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
87f0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8800: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74  Size - 4);.    t
8810: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8820: 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ==maxLocal );.  
8830: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8840: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8850: 29 3b 0a 20 20 20 20 69 66 28 20 73 75 72 70 6c  );.    if( surpl
8860: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
8870: 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  {.      pInfo->n
8880: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
8890: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
88a0: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
88b0: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
88c0: 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ocal;.    }.    
88d0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
88e0: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
88f0: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8900: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8910: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
8920: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
8930: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
8940: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
8950: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
8960: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8970: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8980: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8990: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
89a0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
89b0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
89c0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
89d0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
89e0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
89f0: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
8a00: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
8a10: 7b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  {.  btreeParseCe
8a20: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e  llPtr(pPage, fin
8a30: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
8a40: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
8a50: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
8a60: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8a70: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
8a80: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
8a90: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
8aa0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
8ab0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
8ac0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
8ad0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
8ae0: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
8af0: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
8b00: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
8b10: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
8b20: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
8b30: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
8b40: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
8b50: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
8b60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
8b70: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
8b80: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
8b90: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8ba0: 53 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Size; /* For loo
8bb0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
8bc0: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
8bd0: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
8c00: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
8c10: 2a 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20  */.  u32 nSize; 
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8c40: 20 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72   Size value to r
8c50: 65 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66  eturn */..#ifdef
8c60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
8c70: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  /* The value ret
8c80: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75  urned by this fu
8c90: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c  nction should al
8ca0: 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65  ways be the same
8cb0: 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65   as.  ** the (Ce
8cc0: 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61  llInfo.nSize) va
8cd0: 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69  lue found by doi
8ce0: 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20  ng a full parse 
8cf0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  of the.  ** cell
8d00: 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55  . If SQLITE_DEBU
8d10: 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  G is defined, an
8d20: 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65   assert() at the
8d30: 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20   bottom of.  ** 
8d40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65  this function ve
8d50: 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73  rifies that this
8d60: 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f   invariant is no
8d70: 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20  t violated. */. 
8d80: 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69   CellInfo debugi
8d90: 6e 66 6f 3b 0a 20 20 62 74 72 65 65 50 61 72 73  nfo;.  btreePars
8da0: 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
8db0: 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66  pCell, &debuginf
8dc0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  o);.#endif..  if
8dd0: 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f  ( pPage->noPaylo
8de0: 61 64 20 29 7b 0a 20 20 20 20 70 45 6e 64 20 3d  ad ){.    pEnd =
8df0: 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20   &pIter[9];.    
8e00: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b  while( (*pIter++
8e10: 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  )&0x80 && pIter<
8e20: 70 45 6e 64 20 29 3b 0a 20 20 20 20 61 73 73 65  pEnd );.    asse
8e30: 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  rt( pPage->child
8e40: 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20  PtrSize==4 );.  
8e50: 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70    return (u16)(p
8e60: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
8e70: 20 7d 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49   }.  nSize = *pI
8e80: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
8e90: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
8ea0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
8eb0: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
8ec0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
8ed0: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
8ee0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
8ef0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
8f00: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
8f10: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8f20: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
8f30: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
8f40: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
8f50: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
8f60: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
8f70: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
8f80: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
8f90: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
8fa0: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
8fb0: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
8fc0: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
8fd0: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
8fe0: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
8ff0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
9000: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
9010: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
9020: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
9030: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
9040: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9050: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
9060: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
9070: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
9080: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
9090: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
90a0: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
90b0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
90c0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
90d0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
90e0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
90f0: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
9100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
9110: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
9120: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
9130: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
9140: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
9150: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
9160: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
9170: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
9180: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
9190: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
91a0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
91b0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
91c0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
91d0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
91e0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
91f0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
9200: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
9210: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
9220: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9230: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
9240: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
9250: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
9260: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
9270: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 64  6)nSize;.}..#ifd
9280: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9290: 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f  /* This variatio
92a0: 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72  n on cellSizePtr
92b0: 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64  () is used insid
92c0: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  e of assert() st
92d0: 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79  atements.** only
92e0: 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  . */.static u16 
92f0: 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65  cellSize(MemPage
9300: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65   *pPage, int iCe
9310: 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65  ll){.  return ce
9320: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9330: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
9340: 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64   iCell));.}.#end
9350: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
9360: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
9370: 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  UM./*.** If the 
9380: 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74  cell pCell, part
9390: 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20 63   of page pPage c
93a0: 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
93b0: 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66  r.** to an overf
93c0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
93d0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
93e0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a  he pointer-map.*
93f0: 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  * for the overfl
9400: 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  ow page..*/.stat
9410: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
9420: 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65  tOvflPtr(MemPage
9430: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
9440: 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ll, int *pRC){. 
9450: 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
9460: 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74    if( *pRC ) ret
9470: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
9480: 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 62 74 72  Cell!=0 );.  btr
9490: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
94a0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
94b0: 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e  fo);.  if( info.
94c0: 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  iOverflow ){.   
94d0: 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
94e0: 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
94f0: 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
9500: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
9510: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
9520: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
9530: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
9540: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
9550: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
9560: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
9570: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
9580: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
9590: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
95a0: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
95b0: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
95c0: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
95d0: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
95e0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
95f0: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
9600: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
9610: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
9620: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
9630: 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45  ..**.** EVIDENCE
9640: 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31  -OF: R-44582-601
9650: 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72  38 SQLite may fr
9660: 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20  om time to time 
9670: 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20  reorganize a.** 
9680: 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74  b-tree page so t
9690: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
96a0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66   freeblocks or f
96b0: 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61  ragment bytes, a
96c0: 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74  ll.** unused byt
96d0: 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  es are contained
96e0: 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61   in the unalloca
96f0: 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e  ted space region
9700: 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c  , and all.** cel
9710: 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69  ls are packed ti
9720: 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64  ghtly at the end
9730: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
9740: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
9750: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
9760: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
9770: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
9780: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9790: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
97a0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
97b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
97c0: 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ess of the i-th 
97d0: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64  cell */.  int hd
97e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
97f0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
9800: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
9810: 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b  r */.  int size;
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
9840: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ell */.  int usa
9850: 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  bleSize;        
9860: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9870: 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e   usable bytes on
9880: 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74   a page */.  int
9890: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
98a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
98b0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  t to the cell po
98c0: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
98d0: 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
98f0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
9900: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
9910: 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9930: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
9940: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
9950: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9960: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
9970: 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a   The page data *
9980: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
9990: 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f  r *temp;       /
99a0: 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20  * Temp area for 
99b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  cell content */.
99c0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
99d0: 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20  *src;        /* 
99e0: 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e  Source of conten
99f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
9a00: 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
9a10: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
9a20: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
9a30: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  */.  int iCellLa
9a40: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
9a50: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
9a60: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a   cell index */..
9a70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9a80: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9a90: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9aa0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
9ab0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
9ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9ad0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
9ae0: 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  e <= SQLITE_MAX_
9af0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61  PAGE_SIZE );.  a
9b00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
9b10: 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
9b20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9b30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9b40: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9b50: 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73  .  temp = 0;.  s
9b60: 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67  rc = data = pPag
9b70: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20  e->aData;.  hdr 
9b80: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
9b90: 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74  et;.  cellOffset
9ba0: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
9bb0: 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  fset;.  nCell = 
9bc0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
9bd0: 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67  assert( nCell==g
9be0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
9bf0: 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c  r+3]) );.  usabl
9c00: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
9c10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
9c20: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
9c30: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ize;.  iCellFirs
9c40: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
9c50: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c   2*nCell;.  iCel
9c60: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
9c70: 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d  ze - 4;.  for(i=
9c80: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
9c90: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
9ca0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
9cb0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
9cc0: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
9cd0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
9ce0: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
9cf0: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
9d00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9d10: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
9d20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
9d30: 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 23  ==iCellLast );.#
9d40: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9d50: 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49  TE_ENABLE_OVERSI
9d60: 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20  ZE_CELL_CHECK). 
9d70: 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64     /* These cond
9d80: 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65  itions have alre
9d90: 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65  ady been verifie
9da0: 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61  d in btreeInitPa
9db0: 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 53  ge().    ** if S
9dc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45  QLITE_ENABLE_OVE
9dd0: 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b  RSIZE_CELL_CHECK
9de0: 20 69 73 20 64 65 66 69 6e 65 64 20 0a 20 20 20   is defined .   
9df0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
9e00: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
9e10: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
9e20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9e30: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9e40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9e50: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
9e60: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
9e70: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
9e80: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
9e90: 72 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70 63  r(pPage, &src[pc
9ea0: 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20  ]);.    cbrk -= 
9eb0: 73 69 7a 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  size;.#if define
9ec0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
9ed0: 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48  OVERSIZE_CELL_CH
9ee0: 45 43 4b 29 0a 20 20 20 20 69 66 28 20 63 62 72  ECK).    if( cbr
9ef0: 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a  k<iCellFirst ){.
9f00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
9f10: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9f20: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
9f30: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
9f40: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
9f50: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
9f60: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
9f70: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9f80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
9f90: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
9fa0: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
9fb0: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
9fc0: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
9fd0: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
9fe0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
9ff0: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
a000: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
a010: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
a020: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
a030: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b    if( temp==0 ){
a040: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
a050: 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63      if( cbrk==pc
a060: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a070: 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65     temp = sqlite
a080: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
a090: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
a0a0: 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  er);.      x = g
a0b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
a0c0: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d  r+5]);.      mem
a0d0: 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64  cpy(&temp[x], &d
a0e0: 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69  ata[x], (cbrk+si
a0f0: 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20  ze) - x);.      
a100: 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20  src = temp;.    
a110: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  }.    memcpy(&da
a120: 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70  ta[cbrk], &src[p
a130: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  c], size);.  }. 
a140: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69   assert( cbrk>=i
a150: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70  CellFirst );.  p
a160: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
a170: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
a180: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
a190: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
a1a0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  0;.  data[hdr+7]
a1b0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
a1c0: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
a1d0: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
a1e0: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
a1f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
a200: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
a210: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
a220: 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  ( cbrk-iCellFirs
a230: 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  t!=pPage->nFree 
a240: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a250: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a260: 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
a270: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
a280: 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66  .** Search the f
a290: 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65  ree-list on page
a2a0: 20 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74   pPg for space t
a2b0: 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e  o store a cell n
a2c0: 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a  Byte bytes in.**
a2d0: 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61   size. If one ca
a2e0: 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
a2f0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
a300: 74 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65  the space and re
a310: 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20  move it.** from 
a320: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a  the free-list..*
a330: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  *.** If no suita
a340: 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65  ble space can be
a350: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72   found on the fr
a360: 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20  ee-list, return 
a370: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  NULL..**.** This
a380: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65   function may de
a390: 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20  tect corruption 
a3a0: 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20  within pPg.  If 
a3b0: 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a  corruption is.**
a3c0: 20 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a   detected then *
a3d0: 70 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51  pRc is set to SQ
a3e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64  LITE_CORRUPT and
a3f0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
a400: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 6c  d..**.** If a sl
a410: 6f 74 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  ot of at least n
a420: 42 79 74 65 20 62 79 74 65 73 20 69 73 20 66 6f  Byte bytes is fo
a430: 75 6e 64 20 62 75 74 20 63 61 6e 6e 6f 74 20 62  und but cannot b
a440: 65 20 75 73 65 64 20 62 65 63 61 75 73 65 20 0a  e used because .
a450: 2a 2a 20 74 68 65 72 65 20 61 72 65 20 61 6c 72  ** there are alr
a460: 65 61 64 79 20 61 74 20 6c 65 61 73 74 20 36 30  eady at least 60
a470: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
a480: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 72  s on the page, r
a490: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 20 49  eturn NULL..** I
a4a0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 66 20  n this case, if 
a4b0: 70 62 44 65 66 72 61 67 20 70 61 72 61 6d 65 74  pbDefrag paramet
a4c0: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
a4d0: 73 65 74 20 2a 70 62 44 65 66 72 61 67 20 74 6f  set *pbDefrag to
a4e0: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
a4f0: 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f   u8 *pageFindSlo
a500: 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20  t(MemPage *pPg, 
a510: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
a520: 70 52 63 2c 20 69 6e 74 20 2a 70 62 44 65 66 72  pRc, int *pbDefr
a530: 61 67 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  ag){.  const int
a540: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
a550: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
a560: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
a570: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
a580: 64 64 72 3b 0a 20 20 69 6e 74 20 70 63 3b 0a 20  ddr;.  int pc;. 
a590: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
a5a0: 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
a5b0: 6c 65 53 69 7a 65 3b 0a 0a 20 20 66 6f 72 28 69  leSize;..  for(i
a5c0: 41 64 64 72 3d 68 64 72 2b 31 3b 20 28 70 63 20  Addr=hdr+1; (pc 
a5d0: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
a5e0: 61 5b 69 41 64 64 72 5d 29 29 3e 30 3b 20 69 41  a[iAddr]))>0; iA
a5f0: 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 69 6e 74  ddr=pc){.    int
a600: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
a610: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
a620: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
a630: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
a640: 3a 20 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20  : R-06866-39125 
a650: 46 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61  Freeblocks are a
a660: 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20  lways connected 
a670: 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20  in order of.    
a680: 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66  ** increasing of
a690: 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  fset. */.    if(
a6a0: 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34   pc>usableSize-4
a6b0: 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29   || pc<iAddr+4 )
a6c0: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
a6d0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
a6e0: 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
a6f0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a   0;.    }.    /*
a700: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
a710: 32 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20  22710-53328 The 
a720: 74 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68  third and fourth
a730: 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20   bytes of each. 
a740: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20     ** freeblock 
a750: 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61  form a big-endia
a760: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
a770: 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
a780: 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20  he freeblock.   
a790: 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e   ** in bytes, in
a7a0: 63 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79  cluding the 4-by
a7b0: 74 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  te header. */.  
a7c0: 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74    size = get2byt
a7d0: 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b  e(&aData[pc+2]);
a7e0: 0a 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e  .    if( size>=n
a7f0: 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 69 6e  Byte ){.      in
a800: 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79  t x = size - nBy
a810: 74 65 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  te;.      testca
a820: 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20  se( x==4 );.    
a830: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 33    testcase( x==3
a840: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c   );.      if( x<
a850: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
a860: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
a870: 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20  1498-58022 In a 
a880: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
a890: 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74  ee page, the tot
a8a0: 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  al.        ** nu
a8b0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
a8c0: 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e   fragments may n
a8d0: 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f  ot exceed 60. */
a8e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61  .        if( aDa
a8f0: 74 61 5b 68 64 72 2b 37 5d 3e 3d 36 30 20 29 7b  ta[hdr+7]>=60 ){
a900: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
a910: 62 44 65 66 72 61 67 20 29 20 2a 70 62 44 65 66  bDefrag ) *pbDef
a920: 72 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rag = 1;.       
a930: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
a940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
a950: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f  * Remove the slo
a960: 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  t from the free-
a970: 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65  list. Update the
a980: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
a990: 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64     ** fragmented
a9a0: 20 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68   bytes within th
a9b0: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20  e page. */.     
a9c0: 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61     memcpy(&aData
a9d0: 5b 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b  [iAddr], &aData[
a9e0: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
a9f0: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d   aData[hdr+7] +=
aa00: 20 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65   (u8)x;.      }e
aa10: 6c 73 65 20 69 66 28 20 73 69 7a 65 2b 70 63 20  lse if( size+pc 
aa20: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  > usableSize ){.
aa30: 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53          *pRc = S
aa40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
aa50: 50 54 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  PT;.        retu
aa60: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
aa70: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
aa80: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
aa90: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
aaa0: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
aab0: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
aac0: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
aad0: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
aae0: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
aaf0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
ab00: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
ab10: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
ab20: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
ab30: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
ab40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
ab50: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
ab60: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
ab70: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
ab80: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
ab90: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
aba0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
abb0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
abc0: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
abd0: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
abe0: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
abf0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
ac00: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
ac10: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
ac20: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
ac30: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
ac40: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
ac50: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
ac60: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
ac70: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
ac80: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
ac90: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
aca0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
acb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
acc0: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
acd0: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
ace0: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
acf0: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
ad00: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
ad10: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
ad20: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
ad30: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
ad40: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
ad50: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
ad60: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
ad70: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
ad80: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
ad90: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
ada0: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
adb0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
adc0: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
add0: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
ade0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
adf0: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
ae00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
ae10: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
ae20: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
ae30: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
ae40: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
ae50: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
ae60: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
ae70: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
ae80: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
ae90: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
aea0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
aeb0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
aec0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
aef0: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
af00: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
af10: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
af40: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
af50: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
af60: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
af70: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
af80: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
af90: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
afa0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
afb0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
afc0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
afd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
afe0: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
aff0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b000: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
b010: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
b020: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
b030: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
b040: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
b050: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
b060: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
b070: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b080: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
b090: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
b0a0: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
b0b0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b0c0: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
b0d0: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
b0e0: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
b0f0: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
b100: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
b110: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
b120: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
b130: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
b140: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
b150: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
b160: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
b170: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
b180: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
b190: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
b1a0: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
b1b0: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
b1c0: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
b1d0: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
b1e0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
b1f0: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
b200: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
b210: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
b220: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
b230: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
b240: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
b250: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
b260: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
b270: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
b280: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
b290: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
b2a0: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
b2b0: 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61  2byteNotZero(&da
b2c0: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66  ta[hdr+5]);.  if
b2d0: 28 20 67 61 70 3e 74 6f 70 20 29 20 72 65 74 75  ( gap>top ) retu
b2e0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
b2f0: 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 49 66  T_BKPT;..  /* If
b300: 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68   there is enough
b310: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67   space between g
b320: 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f  ap and top for o
b330: 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69  ne more cell poi
b340: 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20  nter.  ** array 
b350: 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e  entry offset, an
b360: 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73  d if the freelis
b370: 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20  t is not empty, 
b380: 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a  then search the.
b390: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f    ** freelist lo
b3a0: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65  oking for a free
b3b0: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
b3c0: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20   to satisfy the 
b3d0: 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20  request..  */.  
b3e0: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d  testcase( gap+2=
b3f0: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
b400: 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29  se( gap+1==top )
b410: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
b420: 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  p==top );.  if( 
b430: 67 61 70 2b 32 3c 3d 74 6f 70 20 26 26 20 28 64  gap+2<=top && (d
b440: 61 74 61 5b 68 64 72 2b 31 5d 20 7c 7c 20 64 61  ata[hdr+1] || da
b450: 74 61 5b 68 64 72 2b 32 5d 29 20 29 7b 0a 20 20  ta[hdr+2]) ){.  
b460: 20 20 69 6e 74 20 62 44 65 66 72 61 67 20 3d 20    int bDefrag = 
b470: 30 3b 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63  0;.    u8 *pSpac
b480: 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74  e = pageFindSlot
b490: 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26  (pPage, nByte, &
b4a0: 72 63 2c 20 26 62 44 65 66 72 61 67 29 3b 0a 20  rc, &bDefrag);. 
b4b0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
b4c0: 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 62  rn rc;.    if( b
b4d0: 44 65 66 72 61 67 20 29 20 67 6f 74 6f 20 64 65  Defrag ) goto de
b4e0: 66 72 61 67 6d 65 6e 74 5f 70 61 67 65 3b 0a 20  fragment_page;. 
b4f0: 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b     if( pSpace ){
b500: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b510: 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28  Space>=data && (
b520: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36  pSpace - data)<6
b530: 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70  5536 );.      *p
b540: 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61  Idx = (int)(pSpa
b550: 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20  ce - data);.    
b560: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b570: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
b580: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
b590: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c  could not be ful
b5a0: 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20 66  filled using a f
b5b0: 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43  reelist slot.  C
b5c0: 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65  heck.  ** to see
b5d0: 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61 74   if defragmentat
b5e0: 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72 79  ion is necessary
b5f0: 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ..  */.  testcas
b600: 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d  e( gap+2+nByte==
b610: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70  top );.  if( gap
b620: 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a  +2+nByte>top ){.
b630: 20 64 65 66 72 61 67 6d 65 6e 74 5f 70 61 67 65   defragment_page
b640: 3a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  :.    assert( pP
b650: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
b660: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
b670: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
b680: 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
b690: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b6a0: 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20  n rc;.    top = 
b6b0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
b6c0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
b6d0: 20 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e     assert( gap+n
b6e0: 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d  Byte<=top );.  }
b6f0: 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ...  /* Allocate
b700: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65   memory from the
b710: 20 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20   gap in between 
b720: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
b730: 20 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20   array.  ** and 
b740: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b750: 20 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65   area.  The btre
b760: 65 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c  eInitPage() call
b770: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a   has already.  *
b780: 2a 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20  * validated the 
b790: 66 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e  freelist.  Given
b7a0: 20 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69   that the freeli
b7b0: 73 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65  st is valid, the
b7c0: 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61  re.  ** is no wa
b7d0: 79 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  y that the alloc
b7e0: 61 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64  ation can extend
b7f0: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
b800: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54  the page..  ** T
b810: 68 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f  he assert() belo
b820: 77 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70  w verifies the p
b830: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
b840: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20  ..  */.  top -= 
b850: 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74  nByte;.  put2byt
b860: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
b870: 74 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  top);.  assert( 
b880: 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e  top+nByte <= (in
b890: 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  t)pPage->pBt->us
b8a0: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70  ableSize );.  *p
b8b0: 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74  Idx = top;.  ret
b8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b8d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
b8e0: 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20   section of the 
b8f0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20  pPage->aData to 
b900: 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
b910: 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20   The first byte 
b920: 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20  of the new free 
b930: 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e  block is pPage->
b940: 61 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a  aData[iStart].**
b950: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
b960: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53   the block is iS
b970: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
b980: 20 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c   Adjacent freebl
b990: 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63  ocks are coalesc
b9a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ed..**.** Note t
b9b0: 68 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20  hat even though 
b9c0: 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69  the freeblock li
b9d0: 73 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62  st was checked b
b9e0: 79 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  y btreeInitPage(
b9f0: 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69  ),.** that routi
ba00: 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65  ne will not dete
ba10: 63 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65  ct overlap betwe
ba20: 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65  en cells or free
ba30: 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20  blocks.  Nor.** 
ba40: 64 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63  does it detect c
ba50: 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63  ells or freebloc
ba60: 6b 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68  ks that encrouch
ba70: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76   into the reserv
ba80: 65 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74  ed bytes.** at t
ba90: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
baa0: 67 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74  ge.  So do addit
bab0: 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e  ional corruption
bac0: 20 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74   checks inside t
bad0: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61  his.** routine a
bae0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
baf0: 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20  _CORRUPT if any 
bb00: 70 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75  problems are fou
bb10: 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
bb20: 74 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50  t freeSpace(MemP
bb30: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20  age *pPage, u16 
bb40: 69 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a  iStart, u16 iSiz
bb50: 65 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20  e){.  u16 iPtr; 
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
bb80: 64 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f  ddress of ptr to
bb90: 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20   next freeblock 
bba0: 2a 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c  */.  u16 iFreeBl
bbb0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
bbc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
bbd0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
bbe0: 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20  t freeblock */. 
bbf0: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
bc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc10: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68         /* Page h
bc20: 65 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f  eader size.  0 o
bc30: 72 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46  r 100 */.  u8 nF
bc40: 72 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rag = 0;        
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e   /* Reduction in
bc70: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a   fragmentation *
bc80: 2f 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a  /.  u16 iOrigSiz
bc90: 65 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20  e = iSize;      
bca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
bcb0: 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69  ginal value of i
bcc0: 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c  Size */.  u32 iL
bcd0: 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ast = pPage->pBt
bce0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20  ->usableSize-4; 
bcf0: 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69  /* Largest possi
bd00: 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66  ble freeblock of
bd10: 66 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45  fset */.  u32 iE
bd20: 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53  nd = iStart + iS
bd30: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
bd40: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
bd50: 73 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75  st the iStart bu
bd60: 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ffer */.  unsign
bd70: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
bd80: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
bd90: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20  /* Page content 
bda0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
bdb0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
bdc0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bdd0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
bde0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
bdf0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
be00: 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72  tart>=pPage->hdr
be10: 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e  Offset+6+pPage->
be20: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a  childPtrSize );.
be30: 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
be40: 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20  T_DB || iEnd <= 
be50: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
be60: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65  leSize );.  asse
be70: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
be80: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
be90: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
bea0: 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20  ssert( iSize>=4 
beb0: 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  );   /* Minimum 
bec0: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
bed0: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
bee0: 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20  rt<=iLast );..  
bef0: 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c  /* Overwrite del
bf00: 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
bf10: 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e   with zeros when
bf20: 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65   the secure_dele
bf30: 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  te.  ** option i
bf40: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69  s enabled */.  i
bf50: 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62  f( pPage->pBt->b
bf60: 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
bf70: 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
bf80: 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
bf90: 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a  iStart], 0, iSiz
bfa0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
bfb0: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  e list of freebl
bfc0: 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20  ocks must be in 
bfd0: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
bfe0: 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a    Find the .  **
bff0: 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73   spot on the lis
c000: 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20 73  t where iStart s
c010: 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65  hould be inserte
c020: 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20  d..  */.  hdr = 
c030: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
c040: 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b  ;.  iPtr = hdr +
c050: 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69   1;.  if( data[i
c060: 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74  Ptr+1]==0 && dat
c070: 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20  a[iPtr]==0 ){.  
c080: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20    iFreeBlk = 0; 
c090: 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72   /* Shortcut for
c0a0: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
c0b0: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 65  he freelist is e
c0c0: 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  mpty */.  }else{
c0d0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46 72  .    while( (iFr
c0e0: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
c0f0: 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e 30  (&data[iPtr]))>0
c100: 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53 74   && iFreeBlk<iSt
c110: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
c120: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
c130: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c140: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c150: 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72 65       iPtr = iFre
c160: 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  eBlk;.    }.    
c170: 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61  if( iFreeBlk>iLa
c180: 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  st ) return SQLI
c190: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c1a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
c1b0: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
c1c0: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
c1d0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
c1e0: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
c1f0: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
c200: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
c210: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
c220: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
c230: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
c240: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
c250: 20 70 6f 69 6e 74 65 72 20 69 46 72 65 65 42 6c   pointer iFreeBl
c260: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
c270: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
c280: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
c290: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
c2a0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
c2b0: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
c2c0: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
c2d0: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
c2e0: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
c2f0: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
c300: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
c310: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
c320: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c330: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
c340: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
c350: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c360: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
c370: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
c380: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   - iStart;.     
c390: 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32   iFreeBlk = get2
c3a0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c3b0: 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Blk]);.    }.  .
c3c0: 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69      /* If iPtr i
c3d0: 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c  s another freebl
c3e0: 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66  ock (that is, if
c3f0: 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65   iPtr is not the
c400: 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a   freelist.    **
c410: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
c420: 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65  page header) the
c430: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
c440: 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  f iStart should 
c450: 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73  be.    ** coales
c460: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
c470: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
c480: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
c490: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
c4a0: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
c4b0: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
c4c0: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
c4d0: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
c4e0: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
c4f0: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
c500: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
c510: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c520: 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67  T;.        nFrag
c530: 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74   += iStart - iPt
c540: 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53  rEnd;.        iS
c550: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74  ize = iEnd - iPt
c560: 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  r;.        iStar
c570: 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  t = iPtr;.      
c580: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
c590: 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37  nFrag>data[hdr+7
c5a0: 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ] ) return SQLIT
c5b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
c5c0: 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20      data[hdr+7] 
c5d0: 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20  -= nFrag;.  }.  
c5e0: 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74 32  if( iStart==get2
c5f0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c600: 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  ]) ){.    /* The
c610: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
c620: 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  s at the beginni
c630: 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  ng of the cell c
c640: 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20  ontent area,.   
c650: 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65   ** so just exte
c660: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
c670: 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20  ent area rather 
c680: 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74  than create anot
c690: 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c  her.    ** freel
c6a0: 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20  ist entry */.   
c6b0: 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b 31   if( iPtr!=hdr+1
c6c0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c6d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c6e0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c6f0: 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42  a[hdr+1], iFreeB
c700: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
c710: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
c720: 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iEnd);.  }else{.
c730: 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68      /* Insert th
c740: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
c750: 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  into the freelis
c760: 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74  t */.    put2byt
c770: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69  e(&data[iPtr], i
c780: 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74 32  Start);.    put2
c790: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
c7a0: 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
c7b0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
c7c0: 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69  a[iStart+2], iSi
c7d0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
c7e0: 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69 67  ->nFree += iOrig
c7f0: 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  Size;.  return S
c800: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c810: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
c820: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
c830: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
c840: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
c850: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
c860: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
c870: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
c880: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
c890: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
c8a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
c8b0: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
c8c0: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
c8d0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
c8e0: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
c8f0: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
c900: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
c910: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
c920: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c930: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
c940: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
c950: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
c960: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
c970: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
c980: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
c990: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
c9a0: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
c9b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c9c0: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
c9d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
c9e0: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
c9f0: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
ca00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ca10: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
ca20: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
ca30: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
ca40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ca50: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
ca60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
ca70: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
ca80: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
ca90: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
caa0: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
cab0: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
cac0: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
cad0: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
cae0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
caf0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
cb00: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
cb10: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
cb20: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
cb30: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
cb40: 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34  -OF: R-03640-134
cb50: 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20  15 A value of 5 
cb60: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
cb70: 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20  s an interior.  
cb80: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
cb90: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
cba0: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
cbb0: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
cbc0: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
cbd0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35  IDENCE-OF: R-205
cbe0: 30 31 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65  01-61796 A value
cbf0: 20 6f 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65   of 13 means the
cc00: 20 70 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a   page is a leaf.
cc10: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74      ** table b-t
cc20: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
cc30: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45   assert( (PTF_LE
cc40: 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45  AFDATA|PTF_INTKE
cc50: 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20  Y|PTF_LEAF)==13 
cc60: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
cc70: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
cc80: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
cc90: 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  = pPage->leaf;. 
cca0: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
ccb0: 6f 61 64 20 3d 20 21 70 50 61 67 65 2d 3e 6c 65  oad = !pPage->le
ccc0: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
ccd0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
cce0: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
ccf0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
cd00: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
cd10: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
cd20: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
cd30: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
cd40: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
cd50: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
cd60: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
cd70: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
cd80: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
cd90: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
cda0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
cdb0: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
cdc0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
cdd0: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
cde0: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
cdf0: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
ce00: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
ce10: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
ce20: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
ce30: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
ce40: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
ce50: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
ce60: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
ce70: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
ce80: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
ce90: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
cea0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
ceb0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
cec0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
ced0: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
cee0: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
cef0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
cf00: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
cf10: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
cf20: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
cf30: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
cf40: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
cf50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cf60: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
cf70: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
cf80: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
cf90: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
cfa0: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
cfb0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cfc0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
cfd0: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
cfe0: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
cff0: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
d000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
d010: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
d020: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
d030: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
d040: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
d050: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
d060: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
d070: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
d080: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
d090: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
d0a0: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
d0b0: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
d0c0: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
d0d0: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
d0e0: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
d0f0: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
d100: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
d110: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
d120: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
d130: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
d140: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
d150: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
d160: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d170: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
d180: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
d190: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d1a0: 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50  ->pgno==sqlite3P
d1b0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
d1c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
d1d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d1e0: 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65  e == sqlite3Page
d1f0: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
d200: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
d210: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
d220: 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  ata == sqlite3Pa
d230: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
d240: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
d250: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
d260: 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70  nit ){.    u16 p
d270: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
d280: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
d290: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
d2a0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
d2b0: 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20  .    u8 hdr;    
d2c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
d2d0: 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f  t to beginning o
d2e0: 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  f page header */
d2f0: 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20  .    u8 *data;  
d300: 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
d310: 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
d320: 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64   */.    BtShared
d330: 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a   *pBt;        /*
d340: 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20   The main btree 
d350: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
d360: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
d370: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
d380: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
d390: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
d3a0: 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74    u16 cellOffset
d3b0: 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66  ;    /* Offset f
d3c0: 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67  rom start of pag
d3d0: 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20  e to first cell 
d3e0: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  pointer */.    i
d3f0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
d400: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
d410: 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74  nused bytes on t
d420: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69  he page */.    i
d430: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
d440: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d450: 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
d460: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20  ent area */.    
d470: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
d480: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
d490: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
d4a0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
d4b0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c  /.    int iCellL
d4c0: 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74  ast;     /* Last
d4d0: 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f   possible cell o
d4e0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
d4f0: 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d  et */..    pBt =
d500: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
d510: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d520: 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61  drOffset;.    da
d530: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
d540: 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  a;.    /* EVIDEN
d550: 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30  CE-OF: R-28594-0
d560: 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74  2890 The one-byt
d570: 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74  e flag at offset
d580: 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20   0 indicating.  
d590: 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
d5a0: 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20  page type. */.  
d5b0: 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67    if( decodeFlag
d5c0: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
d5d0: 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r]) ) return SQL
d5e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d5f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
d600: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
d610: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
d620: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20  e<=65536 );.    
d630: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
d640: 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67  = (u16)(pBt->pag
d650: 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20  eSize - 1);.    
d660: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
d670: 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65   = 0;.    usable
d680: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
d690: 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  leSize;.    pPag
d6a0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
d6b0: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
d6c0: 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
d6d0: 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
d6e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
d6f0: 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69  = &data[usableSi
d700: 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ze];.    pPage->
d710: 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61  aCellIdx = &data
d720: 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20  [cellOffset];.  
d730: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
d740: 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20  : R-58015-48175 
d750: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
d760: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35  eger at offset 5
d770: 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20   designates.    
d780: 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ** the start of 
d790: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
d7a0: 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61   area. A zero va
d7b0: 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74  lue for this int
d7c0: 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69  eger is.    ** i
d7d0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35  nterpreted as 65
d7e0: 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20  536. */.    top 
d7f0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
d800: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
d810: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
d820: 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37  -OF: R-37002-327
d830: 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  74 The two-byte 
d840: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
d850: 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 3 gives the.  
d860: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63    ** number of c
d870: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
d880: 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e  . */.    pPage->
d890: 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65  nCell = get2byte
d8a0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a  (&data[hdr+3]);.
d8b0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
d8c0: 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
d8d0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f  ) ){.      /* To
d8e0: 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
d8f0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
d900: 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
d910: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
d920: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d930: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d940: 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65    }.    testcase
d950: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
d960: 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a  MX_CELL(pBt) );.
d970: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
d980: 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37  OF: R-24089-5797
d990: 39 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74  9 If a page cont
d9a0: 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77  ains no cells (w
d9b0: 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20  hich is only.   
d9c0: 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
d9d0: 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20   a root page of 
d9e0: 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  a table that con
d9f0: 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74  tains no rows) t
da00: 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f  hen the.    ** o
da10: 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
da20: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77  l content area w
da30: 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61  ill equal the pa
da40: 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68  ge size minus th
da50: 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f  e.    ** bytes o
da60: 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  f reserved space
da70: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
da80: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
da90: 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69  || top==usableSi
daa0: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
dab0: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61   );..    /* A ma
dac0: 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
dad0: 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
dae0: 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
daf0: 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a  t the end.    **
db00: 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61   of page when pa
db10: 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a  rsing a cell.  .
db20: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
db30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
db40: 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73  k of code checks
db50: 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66   early to see if
db60: 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a   a cell extends.
db70: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
db80: 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
db90: 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
dba0: 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
dbb0: 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72   to be .    ** r
dbc0: 65 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f  eturned if it do
dbd0: 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  es..    */.    i
dbe0: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
dbf0: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
dc00: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65  ->nCell;.    iCe
dc10: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
dc20: 69 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66  ize - 4;.#if def
dc30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
dc40: 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c  LE_OVERSIZE_CELL
dc50: 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20  _CHECK).    {.  
dc60: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
dc70: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
dc80: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
dc90: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
dca0: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
dcb0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
dcc0: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
dcd0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
dce0: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
dcf0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
dd00: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
dd10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
dd20: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
dd30: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a  ta[cellOffset+i*
dd40: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  2]);.        tes
dd50: 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c  tcase( pc==iCell
dd60: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20  First );.       
dd70: 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
dd80: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
dd90: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
dda0: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
ddb0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
ddc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ddd0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
dde0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ddf0: 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
de00: 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
de10: 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  c]);.        tes
de20: 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73  tcase( pc+sz==us
de30: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  ableSize );.    
de40: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
de50: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
de60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
de70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
de80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
de90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
dea0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
deb0: 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20  llLast++;.    } 
dec0: 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a   .#endif..    /*
ded0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
dee0: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
def0: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
df00: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
df10: 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20  23588-34450 The 
df20: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
df30: 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76   at offset 1 giv
df40: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  es the.    ** st
df50: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
df60: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
df70: 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
df80: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
df90: 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  no.    ** freebl
dfa0: 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20  ocks. */.    pc 
dfb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
dfc0: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
dfd0: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
dfe0: 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
dff0: 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
e000: 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
e010: 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ace */.    while
e020: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
e030: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
e040: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
e050: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
e060: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
e070: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e080: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
e090: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
e0a0: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
e0b0: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
e0c0: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
e0d0: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
e0e0: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
e0f0: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
e100: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
e110: 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62  ** Or, the freeb
e120: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
e130: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a  end of the page.
e140: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
e150: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e160: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
e170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
e180: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
e190: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
e1a0: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
e1b0: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
e1c0: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
e1d0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
e1e0: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
e1f0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
e200: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
e210: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
e220: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
e230: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
e240: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
e250: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
e260: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
e270: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
e280: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
e290: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e2a0: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
e2b0: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
e2c0: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
e2d0: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
e2e0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
e2f0: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
e300: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
e310: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
e320: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
e330: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
e340: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
e350: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
e360: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
e370: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
e380: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
e390: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
e3a0: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
e3b0: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
e3c0: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
e3d0: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
e3e0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
e3f0: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
e400: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
e410: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
e420: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
e430: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
e440: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
e450: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
e460: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
e470: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
e480: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
e490: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
e4a0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
e4b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e4c0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
e4d0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
e4e0: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
e4f0: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
e500: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
e510: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
e520: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e530: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
e540: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
e550: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
e560: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
e570: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
e580: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
e590: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
e5a0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
e5b0: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
e5c0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
e5d0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
e5e0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
e5f0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
e600: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
e610: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
e620: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
e630: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
e640: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
e650: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
e660: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
e670: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
e680: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
e690: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
e6a0: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
e6b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
e6c0: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
e6d0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
e6e0: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
e6f0: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
e700: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
e710: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
e720: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e730: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
e740: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
e750: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
e760: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
e770: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
e780: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
e790: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
e7a0: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
e7b0: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
e7c0: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
e7d0: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
e7e0: 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
e7f0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
e800: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
e810: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
e820: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
e830: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
e840: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
e850: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
e860: 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
e870: 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
e880: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
e890: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
e8a0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
e8b0: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
e8c0: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
e8d0: 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
e8e0: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
e8f0: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
e900: 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
e910: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
e920: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
e930: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
e940: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
e950: 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
e960: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
e970: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
e980: 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
e990: 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
e9a0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
e9b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
e9c0: 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
e9d0: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
e9e0: 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
e9f0: 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
ea00: 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
ea10: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
ea20: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
ea30: 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
ea40: 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
ea50: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
ea60: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
ea70: 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
ea80: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
ea90: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
eaa0: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
eab0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
eac0: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
ead0: 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
eae0: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
eaf0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
eb00: 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
eb10: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
eb20: 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  et = pPage->pgno
eb30: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
eb40: 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
eb50: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
eb60: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
eb70: 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
eb80: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
eb90: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
eba0: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
ebb0: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   needed..**.** I
ebc0: 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  f the noContent 
ebd0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
ebe0: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
ebf0: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
ec00: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
ec10: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
ec20: 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
ec30: 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
ec40: 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
ec50: 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
ec60: 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
ec70: 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
ec80: 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
ec90: 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
eca0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
ecb0: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
ecc0: 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
ecd0: 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
ece0: 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
ecf0: 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
ed00: 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
ed10: 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
ed20: 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
ed30: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  int..*/.static i
ed40: 6e 74 20 62 74 72 65 65 47 65 74 50 61 67 65 28  nt btreeGetPage(
ed50: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ed60: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
ed70: 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
ed80: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
ed90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
eda0: 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
edb0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
edc0: 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
edd0: 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
ede0: 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
edf0: 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
ee00: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
ee10: 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72  GET_NOCONTENT or
ee20: 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
ee30: 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  NLY */.){.  int 
ee40: 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  rc;.  DbPage *pD
ee50: 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  bPage;..  assert
ee60: 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c  ( flags==0 || fl
ee70: 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e  ags==PAGER_GET_N
ee80: 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67  OCONTENT || flag
ee90: 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41  s==PAGER_GET_REA
eea0: 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72  DONLY );.  asser
eeb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
eec0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
eed0: 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
eee0: 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
eef0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
ef00: 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
ef10: 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  bPage, flags);. 
ef20: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ef30: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
ef40: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
ef50: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
ef60: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
ef70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ef80: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
ef90: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
efa0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
efb0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
efc0: 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72  ge is not.** alr
efd0: 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65  eady in the page
efe0: 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e  r cache return N
eff0: 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20  ULL. Initialize 
f000: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
f010: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
f020: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
f030: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
f040: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
f050: 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68  ePageLookup(BtSh
f060: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
f070: 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  pgno){.  DbPage 
f080: 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
f090: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f0a0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
f0b0: 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20  x) );.  pDbPage 
f0c0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
f0d0: 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
f0e0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
f0f0: 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  DbPage ){.    re
f100: 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72  turn btreePageFr
f110: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
f120: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
f130: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
f140: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
f150: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
f160: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
f170: 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  ages. If there i
f180: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a  s any kind of.**
f190: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28   error, return (
f1a0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31  (unsigned int)-1
f1b0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  )..*/.static Pgn
f1c0: 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o btreePagecount
f1d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
f1e0: 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e  .  return pBt->n
f1f0: 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  Page;.}.u32 sqli
f200: 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67 65  te3BtreeLastPage
f210: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73  (Btree *p){.  as
f220: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
f230: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
f240: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28 70  );.  assert( ((p
f250: 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78  ->pBt->nPage)&0x
f260: 38 30 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20  8000000)==0 );. 
f270: 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67   return btreePag
f280: 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a  ecount(p->pBt);.
f290: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
f2a0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
f2b0: 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  er and initializ
f2c0: 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  e it.  This rout
f2d0: 69 6e 65 20 69 73 20 6a 75 73 74 20 61 0a 2a 2a  ine is just a.**
f2e0: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61   convenience wra
f2f0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61  pper around sepa
f300: 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 20 62 74  rate calls to bt
f310: 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64  reeGetPage() and
f320: 20 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61   .** btreeInitPa
f330: 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ge()..**.** If a
f340: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
f350: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 2a  then the value *
f360: 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
f370: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
f380: 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
f390: 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
f3a0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
f3b0: 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
f3c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
f3d0: 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
f3e0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
f410: 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
f420: 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
f430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f440: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
f450: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
f460: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f480: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
f490: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
f4a0: 20 69 6e 74 20 62 52 65 61 64 6f 6e 6c 79 20 20   int bReadonly  
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4c0: 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 52 45   /* PAGER_GET_RE
f4d0: 41 44 4f 4e 4c 59 20 6f 72 20 30 20 2a 2f 0a 29  ADONLY or 0 */.)
f4e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
f4f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f500: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
f510: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
f520: 28 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 50 41 47  ( bReadonly==PAG
f530: 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
f540: 7c 7c 20 62 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  || bReadonly==0 
f550: 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62  );..  if( pgno>b
f560: 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
f570: 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  t) ){.    rc = S
f580: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f590: 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
f5a0: 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
f5b0: 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
f5c0: 50 61 67 65 2c 20 62 52 65 61 64 6f 6e 6c 79 29  Page, bReadonly)
f5d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
f5e0: 4c 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50  LITE_OK && (*ppP
f5f0: 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
f600: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  ){.      rc = bt
f610: 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
f620: 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
f630: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f640: 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
f650: 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
f660: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f670: 0a 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  ..  testcase( pg
f680: 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
f690: 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
f6a0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
f6b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
f6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
f6d0: 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
f6e0: 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
f6f0: 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
f700: 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
f710: 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
f720: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f730: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
f740: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
f750: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
f760: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
f770: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
f780: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
f790: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
f7a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
f7b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
f7c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
f7d0: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
f7e0: 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
f7f0: 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  age );.    asser
f800: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
f810: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
f820: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
f830: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
f840: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f850: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
f860: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20  t->mutex) );.   
f870: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
f880: 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
f890: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
f8a0: 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
f8b0: 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
f8c0: 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
f8d0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
f8e0: 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
f8f0: 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
f900: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
f910: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
f920: 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
f930: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
f940: 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
f950: 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
f960: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
f970: 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
f980: 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
f990: 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
f9a0: 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
f9b0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
f9c0: 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
f9d0: 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
f9e0: 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
f9f0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
fa00: 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
fa10: 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
fa20: 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
fa30: 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
fa40: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
fa50: 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
fa60: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
fa70: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
fa80: 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
fa90: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
faa0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
fab0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
fac0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
fad0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
fae0: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
faf0: 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
fb00: 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
fb10: 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
fb20: 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
fb30: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
fb40: 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
fb50: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
fb60: 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
fb70: 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
fb80: 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
fb90: 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
fba0: 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
fbb0: 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
fbc0: 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
fbd0: 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
fbe0: 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
fbf0: 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
fc00: 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
fc10: 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
fc20: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
fc30: 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
fc40: 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
fc50: 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
fc60: 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
fc70: 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
fc80: 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
fc90: 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
fca0: 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
fcb0: 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
fcc0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
fcd0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
fce0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
fcf0: 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
fd00: 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
fd10: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
fd20: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
fd30: 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
fd40: 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
fd50: 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
fd60: 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
fd70: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fd80: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fd90: 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
fda0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
fdb0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
fdc0: 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
fdd0: 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
fde0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
fdf0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
fe00: 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
fe10: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
fe20: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
fe30: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
fe40: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
fe50: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
fe60: 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
fe70: 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
fe80: 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
fe90: 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
fea0: 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
feb0: 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
fec0: 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
fed0: 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
fee0: 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
fef0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
ff00: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
ff10: 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
ff20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
ff30: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
ff40: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
ff50: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
ff60: 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
ff70: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
ff80: 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
ff90: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
ffa0: 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
ffb0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
ffc0: 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
ffd0: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
ffe0: 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
fff0: 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
10000 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
10010 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
10020 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
10030 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
10040 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
10050 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
10060 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
10070 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
10080 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
10090 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
100a0 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
100b0 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
100c0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
100d0 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
100e0 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
100f0 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
10100 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
10110 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
10120 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
10130 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
10140 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
10150 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
10160 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10170 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
10180 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
10190 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
101a0 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
101b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
101c0 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
101d0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
101e0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
101f0 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
10200 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
10220 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
10230 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
10240 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
10250 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
10260 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
10270 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
10280 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102a0 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
102b0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
102c0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
102d0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
102e0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
102f0 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
10300 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
10310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
10320 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
10330 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
10340 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
10370 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
10380 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
10390 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
103a0 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
103b0 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
103c0 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
103d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
103e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
103f0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
10400 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
10410 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
10420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10430 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
10440 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
10450 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
10460 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
10470 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
10480 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
10490 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
104a0 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
104b0 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
104c0 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
104d0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
104e0 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
104f0 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
10500 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
10510 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
10520 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
10530 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
10540 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
10550 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
10560 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
10570 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
10580 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
10590 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
105a0 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
105b0 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
105c0 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
105d0 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
105e0 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
105f0 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10610 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
10620 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
10630 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10650 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
10660 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
10670 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
10680 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
10690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
106a0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
106b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
106c0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
106d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
106e0 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
106f0 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
10700 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
10710 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
10720 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
10730 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
10740 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
10750 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
10760 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
10770 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
10780 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
10790 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
107a0 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
107b0 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
107c0 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
107d0 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
107e0 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
107f0 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
10800 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
10810 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
10820 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
10830 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
10840 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
10850 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
10860 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
10870 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
10880 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
10890 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
108a0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
108b0 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
108c0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
108d0 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
108e0 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
108f0 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
10900 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
10910 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10920 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
10930 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
10940 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
10950 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10960 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
10970 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
10980 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
10990 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
109a0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
109b0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
109c0 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
109d0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
109e0 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
109f0 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
10a00 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
10a10 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
10a20 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
10a30 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
10a40 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
10a50 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
10a60 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
10a70 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
10a80 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
10a90 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
10aa0 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
10ab0 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
10ac0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
10ad0 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
10ae0 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
10af0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
10b00 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
10b10 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
10b20 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
10b30 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
10b40 61 6d 65 29 3b 0a 20 20 20 20 20 20 4d 55 54 45  ame);.      MUTE
10b50 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
10b60 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
10b70 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70 2d 3e  red; ).      p->
10b80 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
10b90 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
10ba0 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
10bb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10bc0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
10bd0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10be0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10bf0 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
10c00 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
10c10 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
10c20 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  name, sqlite3Str
10c30 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
10c40 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
10c50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10c60 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
10c70 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
10c80 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
10c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ca0 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61           nFullPa
10cb0 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  thname, zFullPat
10cc0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
10cd0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
10ce0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
10cf0 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
10d00 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10d10 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
10d20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10d30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10d40 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48   }.#if SQLITE_TH
10d50 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d  READSAFE.      m
10d60 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74  utexOpen = sqlit
10d70 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
10d80 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
10d90 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71  _OPEN);.      sq
10da0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
10db0 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  r(mutexOpen);.  
10dc0 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20      mutexShared 
10dd0 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
10de0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
10df0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
10e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
10e10 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
10e20 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a  Shared);.#endif.
10e30 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
10e40 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
10e50 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
10e60 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
10e70 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
10e80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
10e90 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
10ea0 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
10eb0 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
10ec0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
10ed0 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
10ee0 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20  er, 0)).        
10ef0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
10f00 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
10f10 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
10f20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
10f30 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
10f40 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
10f50 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
10f60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
10f70 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
10f80 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
10f90 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
10fa0 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
10fb0 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
10fc0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
10fd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
10fe0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
10ff0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
11000 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
11010 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
11020 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
11030 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11040 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
11060 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
11080 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
11090 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
110a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
110b0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
110c0 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
110d0 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
110e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
110f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11100 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
11110 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
11120 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
11130 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
11140 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
11150 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
11160 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
11170 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
11180 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
11190 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
111a0 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
111b0 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
111c0 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
111d0 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
111e0 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
111f0 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
11200 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
11210 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
11220 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
11230 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
11240 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
11250 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
11260 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
11270 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
11280 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
11290 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
112a0 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
112b0 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
112c0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
112d0 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
112e0 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
112f0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
11300 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
11310 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
11320 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
11330 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
11340 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
11350 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
11360 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
11370 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
11380 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
11390 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
113a0 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
113b0 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
113c0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
113d0 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
113e0 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
113f0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
11400 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
11410 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
11420 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
11430 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
11440 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
11450 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
11460 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
11470 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
11480 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
11490 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
114a0 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
114b0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
114c0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
114d0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
114e0 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
114f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
11520 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
11530 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
11540 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11560 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
11570 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
11580 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
11590 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
115a0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
115b0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
115c0 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
115d0 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
115e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
115f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11600 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
11610 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
11620 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
11630 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
11640 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
11650 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
11660 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
11670 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
11680 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
11690 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
116a0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
116b0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
116c0 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
116d0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
116e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
116f0 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
11700 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
11710 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
11720 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
11730 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
11740 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
11750 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
11760 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
11770 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
11780 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
11790 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
117a0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
117b0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
117c0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
117d0 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
117e0 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
117f0 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
11800 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
11810 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
11820 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
11830 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
11840 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
11850 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
11860 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
11870 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
11880 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
11890 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
118a0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
118b0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
118c0 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
118d0 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
118e0 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
118f0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
11900 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
11910 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11920 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
11930 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
11940 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
11950 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
11960 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
11970 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
11980 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
11990 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
119a0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
119b0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
119c0 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
119d0 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
119e0 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
119f0 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
11a00 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
11a10 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
11a20 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
11a30 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
11a40 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
11a50 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
11a60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
11a70 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
11a80 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
11a90 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
11aa0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
11ab0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
11ac0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
11ad0 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
11ae0 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
11af0 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
11b00 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
11b10 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
11b20 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
11b30 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
11b40 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
11b50 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
11b60 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
11b70 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
11b80 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
11b90 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
11ba0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
11bb0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
11bc0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
11bd0 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
11be0 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
11bf0 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
11c00 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
11c10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
11c20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
11c30 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
11c40 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
11c50 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
11c60 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
11c70 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
11c80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11c90 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
11ca0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
11cb0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
11cc0 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
11cd0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
11ce0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
11cf0 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
11d00 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
11d10 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
11d20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
11d30 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
11d40 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
11d50 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
11d60 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
11d70 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
11d80 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
11d90 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
11da0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
11db0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
11dc0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
11dd0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
11de0 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
11df0 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
11e00 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
11e10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11e20 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
11e30 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
11e40 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
11e50 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
11e60 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
11e70 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
11e80 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
11e90 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
11ea0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
11eb0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
11ec0 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
11ed0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
11ee0 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
11ef0 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
11f00 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
11f10 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
11f20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
11f30 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
11f40 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
11f50 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
11f60 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
11f70 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
11f80 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
11f90 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
11fa0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
11fb0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
11fc0 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
11fd0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
11fe0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
11ff0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12000 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
12010 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
12020 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
12030 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
12040 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
12050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
12060 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12070 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
12080 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
12090 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
120a0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
120b0 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
120c0 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
120d0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
120e0 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
120f0 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
12100 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
12110 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
12120 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
12130 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
12140 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
12150 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
12160 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
12170 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
12180 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
12190 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
121a0 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
121b0 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
121c0 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
121d0 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
121e0 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
121f0 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
12200 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
12210 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
12220 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
12230 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
12240 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
12250 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
12260 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
12270 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
12280 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
12290 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
122a0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
122b0 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
122c0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
122d0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
122e0 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
122f0 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
12300 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70      if( p->pBt<p
12310 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  Sib->pBt ){.    
12320 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
12330 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
12340 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20   p->pPrev = 0;. 
12350 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
12360 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
12370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12380 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
12390 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70  pNext && pSib->p
123a0 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74  Next->pBt<p->pBt
123b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
123c0 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65  pSib = pSib->pNe
123d0 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
123e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
123f0 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  xt = pSib->pNext
12400 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
12410 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20  Prev = pSib;.   
12420 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e         if( p->pN
12430 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ext ){.         
12440 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
12450 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
12460 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53    }.          pS
12470 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20  ib->pNext = p;. 
12480 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12490 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
124a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
124b0 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b  .  *ppBtree = p;
124c0 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  ..btree_open_out
124d0 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
124e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
124f0 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
12500 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ger ){.      sql
12510 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
12520 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
12530 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
12540 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ree(pBt);.    sq
12550 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
12560 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b     *ppBtree = 0;
12570 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
12580 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
12590 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
125a0 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
125b0 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
125c0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
125d0 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
125e0 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
125f0 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
12600 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
12610 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
12620 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
12630 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
12640 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
12650 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
12660 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
12670 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
12680 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
12690 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
126a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
126b0 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
126c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74   }.  }.  if( mut
126d0 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
126e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
126f0 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
12700 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
12710 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
12720 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
12730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12740 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
12750 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
12760 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
12770 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
12780 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
12790 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
127a0 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
127b0 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
127c0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
127d0 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
127e0 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
127f0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
12800 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
12810 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
12820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
12830 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
12840 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
12850 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
12860 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12870 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
12880 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
12890 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
128a0 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
128b0 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
128c0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
128d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
128e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
128f0 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
12900 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
12910 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12920 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12930 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
12940 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12950 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
12960 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
12970 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
12980 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
12990 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
129a0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
129b0 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
129c0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
129d0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
129e0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
129f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
12a00 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
12a10 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
12a20 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
12a30 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
12a40 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
12a50 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
12a60 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
12a70 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
12a80 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
12a90 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
12aa0 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
12ab0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
12ac0 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
12ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12ae0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
12af0 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
12b00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12b10 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
12b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
12b30 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
12b40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
12b50 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
12b60 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
12b70 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
12b80 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12b90 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
12ba0 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
12bb0 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
12bc0 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
12bd0 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
12be0 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
12bf0 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
12c00 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
12c10 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
12c20 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
12c30 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
12c40 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
12c50 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
12c60 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12c70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
12c80 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
12c90 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
12ca0 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
12cb0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12cc0 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
12cd0 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
12ce0 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
12cf0 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
12d00 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
12d10 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
12d20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
12d30 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
12d40 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
12d50 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
12d60 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
12d70 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
12d80 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
12d90 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
12da0 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
12db0 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
12dc0 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
12dd0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
12de0 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
12df0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
12e00 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
12e10 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
12e20 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
12e30 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
12e40 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
12e50 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
12e60 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
12e70 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
12e80 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
12e90 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
12ea0 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
12eb0 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
12ec0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
12ed0 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
12ee0 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
12ef0 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
12f00 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
12f10 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
12f20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
12f30 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
12f40 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
12f50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
12f60 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
12f70 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
12f80 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
12f90 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
12fa0 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
12fb0 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
12fc0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
12fd0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
12fe0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
12ff0 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
13000 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
13010 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
13020 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
13030 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
13040 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
13050 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
13060 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
13070 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
13080 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
13090 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
130a0 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
130b0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
130c0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
130d0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
130e0 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
130f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
13100 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
13110 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
13120 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
13130 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
13140 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
13150 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
13160 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
13170 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
13180 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
13190 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
131a0 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
131b0 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
131c0 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
131d0 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
131e0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
131f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13200 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13210 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
13220 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13230 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
13240 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
13250 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
13260 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
13270 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
13280 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
13290 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
132a0 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
132b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
132c0 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
132d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
132e0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
132f0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
13300 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
13310 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
13320 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
13330 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
13340 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
13350 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
13360 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
13370 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
13380 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
13390 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
133a0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
133b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
133c0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
133d0 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
133e0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
133f0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
13400 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
13410 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
13420 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
13430 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
13440 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
13450 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
13460 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
13470 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
13480 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
13490 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
134a0 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
134b0 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
134c0 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
134d0 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
134e0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
134f0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
13500 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
13510 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
13520 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
13530 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
13540 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
13550 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
13560 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
13570 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
13580 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
13590 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
135a0 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
135b0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
135c0 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
135d0 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
135e0 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
135f0 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
13600 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
13610 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
13620 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
13630 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
13640 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
13650 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13660 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
13670 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
13680 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
13690 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
136a0 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
136b0 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
136c0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
136d0 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
136e0 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
136f0 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
13700 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
13710 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
13720 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
13730 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
13740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13750 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
13760 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
13770 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
13780 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
13790 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
137a0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
137b0 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
137c0 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
137d0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
137e0 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
137f0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
13800 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
13810 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
13820 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
13830 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
13840 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
13850 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
13860 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
13870 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
13880 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
13890 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
138a0 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
138b0 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
138c0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
138d0 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
138e0 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
138f0 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
13900 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
13910 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
13920 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
13930 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
13940 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
13950 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
13960 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
13970 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
13980 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
13990 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
139a0 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
139b0 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
139c0 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
139d0 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
139e0 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
139f0 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
13a00 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
13a10 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
13a20 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
13a30 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
13a40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13a50 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
13a60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13a70 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
13a80 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
13a90 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
13aa0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
13ab0 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
13ac0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
13ad0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13ae0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
13af0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
13b00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
13b10 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
13b20 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
13b30 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
13b40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13b50 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
13b60 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
13b70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13b80 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
13b90 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
13ba0 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
13bb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13bc0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
13bd0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
13be0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
13bf0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
13c00 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13c10 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
13c20 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
13c30 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
13c40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13c50 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13c60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13c70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13c80 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
13c90 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
13ca0 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
13cb0 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
13cc0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
13cd0 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
13ce0 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
13cf0 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
13d00 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
13d10 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
13d20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
13d30 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
13d40 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
13d50 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
13d60 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
13d70 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
13d80 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
13d90 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
13da0 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
13db0 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
13dc0 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
13dd0 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
13de0 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
13df0 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
13e00 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
13e10 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
13e20 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
13e30 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
13e40 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
13e50 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
13e60 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
13e70 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
13e80 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
13e90 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
13ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13eb0 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
13ec0 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
13ed0 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
13ee0 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
13ef0 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
13f00 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
13f10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
13f20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
13f30 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13f40 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
13f50 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
13f60 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13f70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13f80 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
13f90 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
13fa0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
13fb0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
13fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
13fd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
13fe0 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
13ff0 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74 20  en btree is set 
14000 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  to safety level 
14010 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  1.  In other.** 
14020 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52  words, return TR
14030 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20  UE if no sync() 
14040 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69  occurs on the di
14050 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74  sk files..*/.int
14060 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e   sqlite3BtreeSyn
14070 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65 20  cDisabled(Btree 
14080 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
14090 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
140a0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
140b0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
140c0 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
140d0 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74  ex) );  .  sqlit
140e0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
140f0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20 26  .  assert( pBt &
14100 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b  & pBt->pPager );
14110 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
14120 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e  agerNosync(pBt->
14130 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74  pPager);.  sqlit
14140 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14150 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14160 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
14170 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20  e default pages 
14180 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d  size and the num
14190 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20  ber of reserved 
141a0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a  bytes per page..
141b0 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61  ** Or, if the pa
141c0 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65  ge size has alre
141d0 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20  ady been fixed, 
141e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
141f0 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f  ADONLY .** witho
14200 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74  ut changing anyt
14210 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hing..**.** The 
14220 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
14230 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
14240 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
14250 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
14260 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
14270 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
14280 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
14290 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
142a0 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
142b0 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
142c0 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
142d0 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
142e0 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
142f0 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
14300 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
14310 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
14320 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
14330 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
14340 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
14350 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
14360 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
14370 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
14380 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
14390 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
143a0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
143b0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
143c0 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
143d0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
143e0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
143f0 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
14400 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
14410 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  changed..**.** I
14420 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68  f the iFix!=0 th
14430 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53  en the BTS_PAGES
14440 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69  IZE_FIXED flag i
14450 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
14460 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
14470 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
14480 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
14490 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
144a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
144b0 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
144c0 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
144d0 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
144e0 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
144f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14500 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
14510 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
14520 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
14530 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
14540 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
14550 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
14560 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
14570 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
14580 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
14590 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
145a0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
145b0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
145c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
145d0 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
145e0 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
145f0 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
14600 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
14610 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
14620 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
14630 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
14640 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
14650 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
14660 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
14670 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
14680 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
14690 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
146a0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
146b0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
146c0 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
146d0 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
146e0 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
146f0 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
14700 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
14710 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
14720 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
14730 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
14740 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
14750 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
14760 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
14770 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
14780 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
14790 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
147a0 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
147b0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
147c0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
147d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
147e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
147f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
14800 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
14810 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
14820 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
14830 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
14840 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
14850 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
14860 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66  pageSize;.}..#if
14870 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14880 48 41 53 5f 43 4f 44 45 43 29 20 7c 7c 20 64 65  HAS_CODEC) || de
14890 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
148a0 55 47 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  UG)./*.** This f
148b0 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
148c0 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ar to sqlite3Btr
148d0 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20  eeGetReserve(), 
148e0 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a  except that it.*
148f0 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61  * may only be ca
14900 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75  lled if it is gu
14910 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68  aranteed that th
14920 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69  e b-tree mutex i
14930 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c  s already.** hel
14940 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  d..**.** This is
14950 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73   useful in one s
14960 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74  pecial case in t
14970 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f  he backup API co
14980 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a  de where it is.*
14990 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65  * known that the
149a0 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d   shared b-tree m
149b0 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75  utex is held, bu
149c0 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74  t the mutex on t
149d0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
149e0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
149f0 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74   *p is not. In t
14a00 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69  his case if sqli
14a10 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a  te3BtreeEnter().
14a20 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61  ** were to be ca
14a30 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63  lled, it might c
14a40 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65  ollide with some
14a50 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e   other operation
14a60 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   on the.** datab
14a70 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
14a80 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67  owns *p, causing
14a90 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76   undefined behav
14aa0 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ior..*/.int sqli
14ab0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
14ac0 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20  veNoMutex(Btree 
14ad0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
14ae0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
14af0 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
14b00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
14b10 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
14b20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
14b30 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ze;.}.#endif /* 
14b40 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
14b50 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 42 55 47   || SQLITE_DEBUG
14b60 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
14b70 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
14b80 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
14b90 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14ba0 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
14bb0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
14bc0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
14bd0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
14be0 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
14bf0 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
14c00 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
14c10 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
14c20 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
14c30 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
14c40 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
14c50 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 69  extensions..*/.i
14c60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
14c70 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65 20  etReserve(Btree 
14c80 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  *p){.  int n;.  
14c90 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14ca0 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  r(p);.  n = p->p
14cb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
14cc0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
14cd0 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  e;.  sqlite3Btre
14ce0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
14cf0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
14d00 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  Set the maximum 
14d10 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  page count for a
14d20 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78 50   database if mxP
14d30 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e  age is positive.
14d40 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  .** No changes a
14d50 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67  re made if mxPag
14d60 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69  e is 0 or negati
14d70 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73  ve..** Regardles
14d80 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
14d90 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
14da0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
14db0 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  e count..*/.int 
14dc0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50  sqlite3BtreeMaxP
14dd0 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a  ageCount(Btree *
14de0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
14df0 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
14e00 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14e10 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61  .  n = sqlite3Pa
14e20 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28  gerMaxPageCount(
14e30 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  p->pBt->pPager, 
14e40 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
14e50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
14e60 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
14e70 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 42 54  /*.** Set the BT
14e80 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
14e90 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61 67 20  flag if newFlag 
14ea0 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66 20 6e  is 0 or 1.  If n
14eb0 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a  ewFlag is -1,.**
14ec0 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68   then make no ch
14ed0 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73 20 72  anges.  Always r
14ee0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
14ef0 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  of the BTS_SECUR
14f00 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74  E_DELETE.** sett
14f10 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 63 68  ing after the ch
14f20 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ange..*/.int sql
14f30 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
14f40 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
14f50 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
14f60 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
14f70 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
14f80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14f90 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  r(p);.  if( newF
14fa0 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
14fb0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
14fc0 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f 44 45  = ~BTS_SECURE_DE
14fd0 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20 6e 65  LETE;.    if( ne
14fe0 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e  wFlag ) p->pBt->
14ff0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
15000 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
15010 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42   } .  b = (p->pB
15020 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
15030 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
15040 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  !=0;.  sqlite3Bt
15050 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15060 65 74 75 72 6e 20 62 3b 0a 7d 0a 23 65 6e 64 69  eturn b;.}.#endi
15070 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
15080 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
15090 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66  PRAGMAS) || !def
150a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
150b0 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a  _VACUUM) */../*.
150c0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61  ** Change the 'a
150d0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
150e0 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  erty of the data
150f0 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75  base. If the 'au
15100 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72  toVacuum'.** par
15110 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
15120 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61  ro, then auto-va
15130 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61  cuum mode is ena
15140 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69  bled. If zero, i
15150 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64  t.** is disabled
15160 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61  . The default va
15170 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f  lue for the auto
15180 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79  -vacuum property
15190 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e   is .** determin
151a0 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45  ed by the SQLITE
151b0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
151c0 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e  UUM macro..*/.in
151d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
151e0 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
151f0 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61  e *p, int autoVa
15200 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51  cuum){.#ifdef SQ
15210 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
15220 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51  CUUM.  return SQ
15230 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23  LITE_READONLY;.#
15240 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20  else.  BtShared 
15250 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15260 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15270 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28  _OK;.  u8 av = (
15280 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a  u8)autoVacuum;..
15290 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
152a0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70  ter(p);.  if( (p
152b0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
152c0 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
152d0 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a  D)!=0 && (av ?1:
152e0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
152f0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
15300 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
15310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
15320 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
15330 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
15340 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
15350 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
15360 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
15370 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
15380 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
15390 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
153a0 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
153b0 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
153c0 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
153d0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
153e0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
153f0 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
15400 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15410 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
15420 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
15430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
15440 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
15450 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
15460 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
15470 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
15480 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15490 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
154a0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
154b0 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
154c0 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
154d0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
154e0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
154f0 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
15500 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
15510 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
15520 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
15530 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
15540 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
15550 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
15560 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
15570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
15580 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
15590 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
155a0 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
155b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
155c0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
155d0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
155e0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
155f0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
15600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
15610 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
15620 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
15630 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
15640 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
15650 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
15660 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
15670 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
15680 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
15690 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
156a0 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
156b0 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
156c0 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  pBt){.  int rc; 
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156e0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
156f0 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f   subfunctions */
15700 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
15710 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20  e1;     /* Page 
15720 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
15730 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
15740 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
15750 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
15760 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
15770 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61  ase */.  int nPa
15780 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a  geFile = 0;   /*
15790 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
157a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
157b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
157c0 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20 20  PageHeader;     
157d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
157e0 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
157f0 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  se according to 
15800 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  hdr */..  assert
15810 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15820 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
15830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
15840 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a  t->pPage1==0 );.
15850 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
15860 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42  gerSharedLock(pB
15870 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66  t->pPager);.  if
15880 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15890 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
158a0 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
158b0 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31  (pBt, 1, &pPage1
158c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
158d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
158e0 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20  rn rc;..  /* Do 
158f0 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f  some checking to
15900 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65   help insure the
15910 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20   file we opened 
15920 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61  really is.  ** a
15930 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20   valid database 
15940 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50  file. .  */.  nP
15950 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65  age = nPageHeade
15960 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  r = get4byte(28+
15970 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
15980 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ta);.  sqlite3Pa
15990 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
159a0 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
159b0 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50 61  File);.  if( nPa
159c0 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28  ge==0 || memcmp(
159d0 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  24+(u8*)pPage1->
159e0 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29 70  aData, 92+(u8*)p
159f0 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29 21  Page1->aData,4)!
15a00 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
15a10 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20 7d  = nPageFile;.  }
15a20 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20 29  .  if( nPage>0 )
15a30 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53 69  {.    u32 pageSi
15a40 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61 62  ze;.    u32 usab
15a50 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a  leSize;.    u8 *
15a60 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d 3e  page1 = pPage1->
15a70 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d 20  aData;.    rc = 
15a80 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
15a90 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
15aa0 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39 39  F: R-43737-39999
15ab0 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51 4c   Every valid SQL
15ac0 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ite database fil
15ad0 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20  e begins.    ** 
15ae0 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
15af0 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e 20  ng 16 bytes (in 
15b00 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20 36  hex): 53 51 4c 6
15b10 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36 66  9 74 65 20 66 6f
15b20 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36 31   72 6d.    ** 61
15b30 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a 2f   74 20 33 00. */
15b40 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
15b50 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61  page1, zMagicHea
15b60 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20  der, 16)!=0 ){. 
15b70 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
15b80 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
15b90 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
15ba0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69  E_OMIT_WAL.    i
15bb0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
15bc0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
15bd0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
15be0 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
15bf0 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
15c00 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  1 ){.      goto 
15c10 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
15c20 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  d;.    }.#else. 
15c30 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d     if( page1[18]
15c40 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  >2 ){.      pBt-
15c50 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
15c60 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20  _READ_ONLY;.    
15c70 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
15c80 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 67  19]>2 ){.      g
15c90 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
15ca0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
15cb0 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69 74    /* If the writ
15cc0 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65 74  e version is set
15cd0 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74 61   to 2, this data
15ce0 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20 61  base should be a
15cf0 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20 69  ccessed.    ** i
15d00 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74  n WAL mode. If t
15d10 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c  he log is not al
15d20 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e  ready open, open
15d30 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20   it now. Then . 
15d40 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c     ** return SQL
15d50 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72  ITE_OK and retur
15d60 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c 61  n without popula
15d70 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70 50  ting BtShared.pP
15d80 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65  age1..    ** The
15d90 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73 20   caller detects 
15da0 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20 74  this and calls t
15db0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
15dc0 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20  in. This is.    
15dd0 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20 74  ** required as t
15de0 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 61  he version of pa
15df0 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20 69  ge 1 currently i
15e00 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66 66  n the page1 buff
15e10 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  er.    ** may no
15e20 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74 20  t be the latest 
15e30 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65 20  version - there 
15e40 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20 6f  may be a newer o
15e50 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20  ne in the log.  
15e60 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a    ** file..    *
15e70 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  /.    if( page1[
15e80 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e  19]==2 && (pBt->
15e90 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 4e  btsFlags & BTS_N
15ea0 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  O_WAL)==0 ){.   
15eb0 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20     int isOpen = 
15ec0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
15ed0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57 61  lite3PagerOpenWa
15ee0 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  l(pBt->pPager, &
15ef0 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 69  isOpen);.      i
15f00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15f10 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
15f20 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
15f30 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ed;.      }else 
15f40 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b  if( isOpen==0 ){
15f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
15f60 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54  EFAULT_WAL_SAFET
15f70 59 4c 45 56 45 4c 0a 20 20 20 20 20 20 20 20 2f  YLEVEL.        /
15f80 2a 20 44 65 66 61 75 6c 74 20 74 6f 20 73 70 65  * Default to spe
15f90 63 69 66 69 65 64 20 73 61 66 65 74 79 5f 6c 65  cified safety_le
15fa0 76 65 6c 20 66 6f 72 20 57 41 4c 20 6d 6f 64 65  vel for WAL mode
15fb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
15fc0 70 42 74 2d 3e 64 62 21 3d 30 20 26 26 20 70 42  pBt->db!=0 && pB
15fd0 74 2d 3e 64 62 2d 3e 61 44 62 21 3d 30 20 29 7b  t->db->aDb!=0 ){
15fe0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
15ff0 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Db;.          sq
16000 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 2d  lite3 *db = pBt-
16010 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 44  >db;.          D
16020 62 20 2a 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b *aDb = db->aDb
16030 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 6c  ;.          u8 l
16040 65 76 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  evel = 0;.      
16050 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
16060 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
16070 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
16080 69 66 28 20 61 44 62 5b 69 44 62 5d 2e 70 42 74  if( aDb[iDb].pBt
16090 20 26 26 20 61 44 62 5b 69 44 62 5d 2e 70 42 74   && aDb[iDb].pBt
160a0 2d 3e 70 42 74 3d 3d 70 42 74 20 29 20 62 72 65  ->pBt==pBt ) bre
160b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
160c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
160d0 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
160e0 0a 20 20 20 20 20 20 20 20 20 20 6c 65 76 65 6c  .          level
160f0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
16100 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20  safety_level;.  
16110 20 20 20 20 20 20 20 20 69 66 28 20 21 53 51 4c          if( !SQL
16120 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65  ITE_DbSafetyLeve
16130 6c 49 73 46 69 78 65 64 28 6c 65 76 65 6c 29 20  lIsFixed(level) 
16140 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  && .            
16150 20 28 53 51 4c 49 54 45 5f 44 62 53 61 66 65 74   (SQLITE_DbSafet
16160 79 4c 65 76 65 6c 56 61 6c 75 65 28 6c 65 76 65  yLevelValue(leve
16170 6c 29 20 21 3d 20 53 51 4c 49 54 45 5f 44 45 46  l) != SQLITE_DEF
16180 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c  AULT_WAL_SAFETYL
16190 45 56 45 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  EVEL) ){.       
161a0 20 20 20 20 20 61 44 62 5b 69 44 62 5d 2e 73 61       aDb[iDb].sa
161b0 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c  fety_level = SQL
161c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
161d0 53 41 46 45 54 59 4c 45 56 45 4c 3b 0a 20 20 20  SAFETYLEVEL;.   
161e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
161f0 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
16200 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
16210 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16220 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 2c  WAL_SAFETYLEVEL,
16230 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c           (db->fl
16260 61 67 73 26 53 51 4c 49 54 45 5f 46 75 6c 6c 46  ags&SQLITE_FullF
16270 53 79 6e 63 29 21 3d 30 2c 0a 20 20 20 20 20 20  Sync)!=0,.      
16280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162a0 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
162b0 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53 79 6e 63  TE_CkptFullFSync
162c0 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 20  )!=0);.         
162d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
162e0 64 69 66 0a 20 20 20 20 20 20 20 20 72 65 6c 65  dif.        rele
162f0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
16300 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
16320 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
16330 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
16340 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
16350 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
16360 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65  -15465-20813 The
16370 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e   maximum and min
16380 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61  imum embedded pa
16390 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61  yload.    ** fra
163a0 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c  ctions and the l
163b0 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63  eaf payload frac
163c0 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74  tion values must
163d0 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20   be 64, 32, and 
163e0 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  32..    **.    *
163f0 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
16400 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
16410 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
16420 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
16430 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
16440 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
16450 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
16460 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16470 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
16480 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
16490 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
164a0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
164b0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
164c0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
164d0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
164e0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
164f0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
16500 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
16510 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
16520 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
16530 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
16540 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
16550 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
16560 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
16570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16580 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20  */.    pageSize 
16590 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
165a0 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
165b0 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  6);.    /* EVIDE
165c0 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d  NCE-OF: R-25008-
165d0 32 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f  21688 The size o
165e0 66 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f  f a page is a po
165f0 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a  wer of two.    *
16600 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  * between 512 an
16610 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76  d 65536 inclusiv
16620 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28  e. */.    if( ((
16630 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
16640 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c  Size)!=0.     ||
16650 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
16660 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a  _MAX_PAGE_SIZE .
16670 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
16680 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20  <=256 .    ){.  
16690 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
166a0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
166b0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
166c0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
166d0 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
166e0 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35  CE-OF: R-59310-5
166f0 31 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76  1205 The "reserv
16700 65 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69  ed space" size i
16710 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20  n the 1-byte.   
16720 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f   ** integer at o
16730 66 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20  ffset 20 is the 
16740 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16750 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
16760 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61  end of.    ** ea
16770 63 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72  ch page to reser
16780 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e  ve for extension
16790 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s. .    **.    *
167a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
167b0 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
167c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
167d0 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
167e0 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
167f0 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
16800 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
16810 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
16820 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
16830 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
16840 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
16850 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53  . */.    usableS
16860 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
16870 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
16880 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
16890 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
168a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
168b0 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
168c0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
168d0 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
168e0 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
168f0 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
16900 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
16910 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
16920 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
16930 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
16940 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
16950 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
16960 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
16970 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
16980 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
16990 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
169a0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
169b0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
169c0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
169d0 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
169e0 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
169f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
16a00 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
16a10 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
16a20 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
16a30 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
16a40 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
16a50 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
16a60 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
16a70 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
16a80 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
16a90 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
16aa0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
16ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ad0 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
16ae0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
16af0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16b00 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
16b10 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
16b20 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
16b30 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
16b40 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
16b50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
16b60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
16b70 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
16b80 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
16b90 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
16ba0 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
16bb0 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
16bc0 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
16bd0 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
16be0 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
16bf0 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
16c00 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
16c10 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
16c20 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
16c30 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
16c40 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
16c50 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
16c60 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
16c70 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
16c80 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
16c90 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
16ca0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
16cb0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
16cc0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
16cd0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
16ce0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
16cf0 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
16d00 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
16d10 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
16d20 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
16d30 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
16d40 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
16d50 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
16d60 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
16d70 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
16d80 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
16d90 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
16da0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
16db0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
16dc0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
16dd0 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
16de0 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
16df0 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
16e00 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
16e10 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
16e20 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
16e30 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
16e40 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
16e50 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
16e60 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
16e70 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
16e80 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
16e90 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
16ea0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
16eb0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
16ec0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
16ed0 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
16ee0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
16ef0 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
16f00 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
16f10 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
16f20 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
16f30 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
16f40 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
16f50 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
16f60 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
16f70 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
16f80 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
16f90 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
16fa0 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
16fb0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
16fc0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
16fd0 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
16fe0 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
16ff0 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
17000 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
17010 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
17020 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
17030 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
17040 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
17050 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
17060 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
17070 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
17080 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
17090 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
170a0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
170b0 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
170c0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
170d0 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
170e0 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
170f0 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
17100 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
17110 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
17120 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
17130 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
17140 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
17150 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
17160 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
17170 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17180 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
17190 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
171a0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
171b0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
171c0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
171d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
171e0 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
171f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
17200 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42  rsors open on pB
17210 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  t. This is for u
17220 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
17230 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
17240 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
17250 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
17260 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
17270 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72  d..**.** Only wr
17280 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
17290 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c  counted if wrOnl
172a0 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77  y is true.  If w
172b0 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73  rOnly is.** fals
172c0 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f  e then all curso
172d0 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a  rs are counted..
172e0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
172f0 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
17300 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72  outine, a cursor
17310 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
17320 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
17330 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20  e of reading or 
17340 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
17350 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72  atabase.  Cursor
17360 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62  s that.** have b
17370 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f  een tripped into
17380 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c   the CURSOR_FAUL
17390 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20  T state are not 
173a0 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  counted..*/.stat
173b0 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69  ic int countVali
173c0 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  dCursors(BtShare
173d0 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e  d *pBt, int wrOn
173e0 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
173f0 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
17400 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
17410 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
17420 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
17430 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77  ext){.    if( (w
17440 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75  rOnly==0 || (pCu
17450 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
17460 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30  CF_WriteFlag)!=0
17470 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  ).     && pCur->
17480 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
17490 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
174a0 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
174b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
174c0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
174d0 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
174e0 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
174f0 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
17500 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
17510 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
17520 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
17530 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
17540 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
17550 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
17560 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
17570 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
17580 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
17590 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
175a0 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
175b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
175c0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
175d0 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
175e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
175f0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
17600 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
17610 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
17620 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
17630 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17640 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
17650 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
17660 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
17670 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70  s(pBt,0)==0 || p
17680 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
17690 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
176a0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
176b0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
176c0 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
176d0 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65  ge1!=0 ){.    Me
176e0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
176f0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
17700 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d   assert( pPage1-
17710 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
17720 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
17730 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
17740 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
17750 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
17760 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
17770 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a  ge(pPage1);.  }.
17780 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
17790 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
177a0 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
177b0 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
177c0 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
177d0 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
177e0 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
177f0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
17800 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
17810 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
17820 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
17830 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
17840 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
17850 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
17860 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
17870 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
17880 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
17890 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
178a0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
178b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
178c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
178d0 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
178e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
178f0 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
17900 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
17910 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
17920 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
17930 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
17940 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
17950 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
17960 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
17970 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
17980 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
17990 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
179a0 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
179b0 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
179c0 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
179d0 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
179e0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
179f0 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
17a00 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
17a10 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
17a20 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
17a30 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
17a40 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
17a50 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
17a60 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
17a70 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
17a80 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
17a90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
17aa0 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
17ab0 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
17ac0 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
17ad0 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
17ae0 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
17af0 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
17b00 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
17b10 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
17b20 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
17b30 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
17b40 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
17b50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17b60 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
17b70 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
17b80 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
17b90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
17ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
17bb0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
17bc0 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
17bd0 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
17be0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
17bf0 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
17c00 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
17c10 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
17c20 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
17c30 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
17c40 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
17c50 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
17c60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17c70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
17c80 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
17c90 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
17ca0 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
17cb0 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
17cc0 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
17cd0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
17ce0 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
17cf0 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
17d00 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
17d10 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
17d20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
17d30 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
17d40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17d50 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
17d60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
17d70 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17d80 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
17d90 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
17da0 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
17db0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
17dc0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17dd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17de0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
17df0 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
17e00 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
17e10 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
17e20 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
17e30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
17e40 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
17e50 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
17e60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
17e70 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
17e80 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
17e90 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
17ea0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
17eb0 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
17ec0 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
17ed0 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
17ee0 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
17ef0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
17f00 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
17f10 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
17f20 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
17f30 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
17f40 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
17f50 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
17f60 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
17f70 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
17f80 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
17f90 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
17fa0 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
17fb0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
17fc0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
17fd0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
17fe0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
17ff0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
18000 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
18010 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
18020 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
18030 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
18040 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
18050 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
18060 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
18070 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
18080 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
18090 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
180a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
180b0 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
180c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
180d0 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
180e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
180f0 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
18100 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
18110 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
18120 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
18130 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
18140 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
18150 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
18160 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
18170 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
18180 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
18190 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
181a0 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
181b0 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
181c0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
181d0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
181e0 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
181f0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
18200 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
18210 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
18220 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
18230 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
18240 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
18250 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
18260 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
18270 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
18280 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
18290 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
182a0 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
182b0 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
182c0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
182d0 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
182e0 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
182f0 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
18300 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
18310 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
18320 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
18330 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
18340 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
18350 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
18360 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
18370 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
18380 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
18390 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
183a0 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
183b0 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
183c0 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
183d0 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
183e0 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
183f0 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
18400 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
18410 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
18420 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
18430 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
18440 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
18450 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
18460 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
18470 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18480 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
18490 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
184a0 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
184b0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
184c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
184d0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
184e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
184f0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18500 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
18510 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
18520 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
18530 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
18540 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
18550 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
18560 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
18570 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
18580 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
18590 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
185a0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
185b0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
185c0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
185d0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
185e0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
185f0 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
18600 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
18610 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
18620 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
18630 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
18640 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
18650 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
18660 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
18670 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
18680 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
18690 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
186a0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
186b0 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
186c0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
186d0 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
186e0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
186f0 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
18700 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
18710 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
18720 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18730 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
18740 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72  .  /* If another
18750 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
18760 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
18770 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
18780 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e  saction .  ** on
18790 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
187a0 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
187b0 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
187c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
187d0 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72   ** requested, r
187e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43  eturn SQLITE_LOC
187f0 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  KED..  */.  if( 
18800 28 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e  (wrflag && pBt->
18810 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
18820 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 7c  RANS_WRITE).   |
18830 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
18840 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
18850 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42 6c 6f  =0.  ){.    pBlo
18860 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
18870 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69  r->db;.  }else i
18880 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
18890 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
188a0 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  ;.    for(pIter=
188b0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
188c0 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
188d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
188e0 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
188f0 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  =p ){.        pB
18900 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42  lock = pIter->pB
18910 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
18920 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18930 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
18940 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73   pBlock ){.    s
18950 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
18960 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70  Blocked(p->db, p
18970 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d  Block);.    rc =
18980 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53   SQLITE_LOCKED_S
18990 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20  HAREDCACHE;.    
189a0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
189b0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
189c0 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
189d0 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
189e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
189f0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
18a00 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
18a10 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
18a20 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
18a30 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
18a40 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
18a50 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
18a60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18a70 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
18a80 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
18a90 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
18aa0 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
18ab0 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
18ac0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
18ad0 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
18ae0 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
18af0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
18b00 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
18b10 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
18b20 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
18b30 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
18b40 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
18b50 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
18b60 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
18b70 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
18b80 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
18b90 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
18ba0 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
18bb0 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
18bc0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
18bd0 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
18be0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
18bf0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
18c00 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
18c10 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
18c20 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
18c30 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
18c40 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
18c50 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
18c60 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
18c70 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
18c80 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
18c90 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
18ca0 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
18cb0 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
18cc0 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
18cd0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
18ce0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
18cf0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
18d00 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
18d10 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
18d20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
18d30 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
18d40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
18d50 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
18d60 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18d70 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
18d80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
18d90 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
18da0 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
18db0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
18dc0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
18dd0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
18de0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
18df0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
18e00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18e10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18e20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
18e30 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
18e40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18e50 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
18e60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18e70 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
18e80 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
18e90 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
18ea0 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
18eb0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
18ec0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
18ed0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
18ee0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
18ef0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
18f00 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
18f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18f20 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
18f30 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
18f40 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
18f50 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
18f60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18f70 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
18f80 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
18f90 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
18fa0 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
18fb0 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
18fc0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
18fd0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
18fe0 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
18ff0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
19000 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
19010 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
19020 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
19030 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
19040 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
19050 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
19060 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
19070 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
19080 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
19090 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
190a0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
190b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
190c0 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
190d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
190e0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
190f0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
19100 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
19110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19120 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
19130 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
19140 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
19150 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
19160 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
19170 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
19180 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
19190 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
191a0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
191b0 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
191c0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
191d0 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
191e0 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
191f0 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
19200 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
19210 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
19220 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
19230 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
19240 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
19250 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
19260 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
19270 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
19280 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
19290 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
192a0 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
192b0 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
192c0 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
192d0 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
192e0 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
192f0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
19300 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
19310 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
19320 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
19330 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
19340 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
19350 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
19360 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
19370 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
19380 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
19390 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
193a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
193b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
193c0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
193d0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
193e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
193f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19400 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
19410 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
19420 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
19430 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
19440 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
19450 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
19460 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
19470 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
19480 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
19490 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
194a0 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
194b0 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
194c0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
194d0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
194e0 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
194f0 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
19500 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
19510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19520 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
19530 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
19540 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
19550 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
19560 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
19570 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
19580 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
19590 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
195a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
195b0 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
195c0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
195d0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
195e0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
195f0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
19600 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
19610 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
19620 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
19630 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
19640 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
19650 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
19660 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
19670 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
19680 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
19690 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
196a0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
196d0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
196e0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19710 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
19720 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
19730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19750 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
19760 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
19770 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
19780 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
19790 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
197a0 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
197b0 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
197c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
197d0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
197e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
197f0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
19800 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
19810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19820 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
19830 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
19840 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
19850 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
19860 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
19870 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
19880 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
19890 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
198a0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
198b0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
198c0 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
198d0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
198e0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
198f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
19900 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
19910 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
19920 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
19930 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
19940 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
19950 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
19960 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
19970 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
19980 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
19990 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
199a0 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
199b0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
199c0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
199d0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
199e0 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
199f0 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
19a00 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
19a10 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
19a20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
19a30 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
19a40 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
19a50 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
19a60 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
19a70 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
19a80 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
19a90 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
19aa0 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
19ab0 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
19ac0 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
19ad0 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
19ae0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
19af0 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
19b00 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
19b10 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
19b20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
19b40 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
19b50 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
19b60 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
19b70 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
19b80 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
19b90 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
19ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19bb0 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
19bc0 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
19bd0 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
19be0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
19bf0 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
19c00 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
19c10 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
19c20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
19c30 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
19c40 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
19c50 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
19c60 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
19c70 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
19c80 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
19c90 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
19ca0 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
19cb0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
19cc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19cd0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
19ce0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
19cf0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
19d00 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
19d10 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
19d20 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
19d30 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
19d40 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
19d50 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
19d60 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
19d70 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
19d80 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
19d90 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
19da0 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
19db0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19dc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
19dd0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
19de0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
19df0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
19e00 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
19e10 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
19e20 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
19e30 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
19e40 3b 0a 0a 20 20 20 20 62 74 72 65 65 49 6e 69 74  ;..    btreeInit
19e50 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
19e60 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
19e70 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
19e80 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
19e90 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
19ea0 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
19eb0 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
19ec0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
19ed0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
19ee0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
19ef0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 62 74  info;.        bt
19f00 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
19f10 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
19f20 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
19f30 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
19f40 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65  .         && pCe
19f50 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll+info.iOverflo
19f60 77 2b 33 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  w+3<=pPage->aDat
19f70 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
19f80 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
19f90 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
19fa0 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
19fb0 6c 6f 77 5d 29 0a 20 20 20 20 20 20 20 20 29 7b  low]).        ){
19fc0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
19fd0 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
19fe0 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29  iOverflow], iTo)
19ff0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1a000 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1a010 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a020 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1a030 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a  Cell)==iFrom ){.
1a040 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1a050 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a  te(pCell, iTo);.
1a060 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1a070 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a080 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1a090 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a  if( i==nCell ){.
1a0a0 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21        if( eType!
1a0b0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
1a0c0 20 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34   .          get4
1a0d0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1a0e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1a0f0 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29  set+8])!=iFrom )
1a100 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1a110 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1a120 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
1a130 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1a140 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1a150 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
1a160 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iTo);.    }..   
1a170 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
1a180 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d   isInitOrig;.  }
1a190 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a1a0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1a1b0 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1a1c0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1a1d0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1a1e0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1a1f0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1a200 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1a210 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1a220 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1a230 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1a240 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1a250 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1a260 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1a270 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1a280 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1a290 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1a2a0 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1a2b0 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1a2c0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1a2d0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1a2e0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1a2f0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1a300 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1a310 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1a320 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1a330 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1a340 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1a350 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1a360 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1a370 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1a380 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1a390 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1a3a0 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1a3b0 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1a3c0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1a3d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1a3e0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1a3f0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1a400 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1a410 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1a420 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1a430 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1a440 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1a450 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1a460 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1a470 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1a480 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1a490 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1a4a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1a4b0 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1a4c0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1a4d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1a4e0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1a4f0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1a500 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1a510 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1a520 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1a530 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1a540 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1a550 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1a560 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1a570 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1a580 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1a590 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1a5a0 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1a5b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1a5c0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1a5d0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1a5e0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1a5f0 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
1a600 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1a610 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1a620 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1a630 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1a640 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1a650 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1a660 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1a670 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1a680 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1a690 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1a6a0 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1a6b0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1a6c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1a6d0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1a6e0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1a6f0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1a700 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1a710 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a720 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1a730 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1a740 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1a750 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1a760 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1a770 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1a780 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1a790 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1a7a0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1a7b0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1a7c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1a7d0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1a7e0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1a7f0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1a800 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1a810 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1a820 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1a830 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1a840 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1a850 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1a860 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1a870 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1a880 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1a890 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1a8a0 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1a8b0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1a8c0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1a8d0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1a8e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1a8f0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1a900 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1a910 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1a920 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1a930 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1a940 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1a950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1a960 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1a980 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1a990 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1a9a0 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1a9b0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1a9c0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1a9d0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1a9e0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1a9f0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1aa00 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1aa10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1aa20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1aa30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1aa40 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1aa50 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1aa60 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1aa70 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1aa80 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1aa90 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1aaa0 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1aab0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1aac0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1aad0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1aae0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1aaf0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1ab00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1ab10 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1ab20 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1ab30 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1ab40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ab50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1ab60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1ab70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ab80 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1ab90 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1aba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1abb0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1abc0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1abd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1abe0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1abf0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1ac00 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1ac10 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1ac20 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1ac30 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1ac40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ac50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1ac60 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1ac70 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1ac80 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1ac90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1aca0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1acb0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1acc0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1acd0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1ace0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1acf0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1ad00 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1ad10 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1ad20 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1ad30 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1ad40 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1ad50 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1ad60 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1ad70 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1ad80 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1ad90 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1ada0 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1adb0 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1adc0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1add0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1ade0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1adf0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1ae00 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1ae10 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1ae20 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1ae30 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1ae40 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1ae50 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1ae60 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1ae70 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1ae80 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1ae90 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1aea0 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1aeb0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1aec0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1aed0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1aee0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1aef0 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1af00 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1af10 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1af20 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1af30 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1af40 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1af50 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1af60 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1af70 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1af80 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1af90 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1afa0 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1afb0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1afc0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1afd0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1afe0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1aff0 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1b000 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1b010 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1b020 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1b030 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1b040 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1b050 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1b060 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1b070 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1b080 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1b090 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1b0a0 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1b0b0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1b0c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b0d0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1b0e0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1b0f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1b100 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b110 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1b120 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1b130 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1b140 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1b150 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1b160 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1b170 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1b180 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1b190 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1b1a0 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1b1b0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1b1c0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1b1d0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1b1e0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1b1f0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1b200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b210 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1b220 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1b230 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1b240 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1b250 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b270 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b280 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1b290 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1b2a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b2b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1b2c0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1b2d0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1b2e0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1b2f0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1b300 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1b310 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1b320 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1b330 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1b340 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1b350 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1b360 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1b370 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1b380 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1b390 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1b3a0 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1b3b0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1b3c0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1b3d0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1b3e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1b3f0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1b400 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1b410 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1b420 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1b430 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1b440 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1b450 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1b460 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1b470 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1b480 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1b490 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1b4a0 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1b4b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b4c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b4d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b4e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1b4f0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1b500 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1b510 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1b520 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1b530 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1b540 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b560 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1b570 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1b580 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1b590 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1b5a0 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1b5b0 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1b5c0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1b5d0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1b5e0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1b5f0 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1b600 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1b610 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1b620 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1b630 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1b640 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1b650 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1b660 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1b670 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1b680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b690 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1b6a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1b6b0 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1b6c0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1b6d0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1b6e0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1b6f0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1b700 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1b710 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1b720 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1b730 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1b740 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1b750 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1b760 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1b770 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1b780 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1b790 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1b7a0 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1b7b0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1b7c0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1b7d0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1b7e0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1b7f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1b800 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1b810 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1b820 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1b830 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1b840 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1b850 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1b860 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1b870 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1b880 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1b890 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1b8a0 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1b8b0 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1b8c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1b8e0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1b8f0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1b900 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1b910 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1b920 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1b930 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1b940 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1b950 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1b960 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1b970 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1b980 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1b990 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1b9a0 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1b9b0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1b9c0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1b9d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1b9e0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1b9f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ba00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1ba10 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1ba20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1ba30 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1ba40 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1ba50 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1ba60 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1ba70 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1ba80 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1ba90 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1baa0 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1bab0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1bac0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1bad0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1bae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1baf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1bb00 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1bb10 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1bb20 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1bb30 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1bb40 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1bb50 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1bb60 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1bb70 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1bb80 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1bb90 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1bba0 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1bbb0 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1bbc0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1bbd0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1bbe0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1bbf0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1bc00 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1bc10 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1bc40 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1bc50 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1bc60 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1bc90 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1bca0 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1bcb0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1bcc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1bcd0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1bce0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1bcf0 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1bd00 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1bd10 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1bd20 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1bd30 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1bd40 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1bd50 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1bd60 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1bd70 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1bd80 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1bd90 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1bda0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1bdb0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1bdc0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1bdd0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1bde0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1bdf0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1be00 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1be10 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1be20 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1be30 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1be40 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1be50 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1be60 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1be70 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1be80 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1be90 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1bea0 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1beb0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1bec0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1bed0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1bee0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1bef0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1bf00 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1bf10 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1bf20 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1bf30 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1bf40 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1bf50 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1bf60 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1bf70 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1bf80 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1bf90 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1bfa0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1bfb0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1bfc0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1bfd0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1bfe0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1bff0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1c000 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1c010 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1c020 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1c030 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1c040 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1c050 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1c060 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1c070 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1c080 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1c090 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1c0a0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1c0b0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1c0c0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1c0d0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1c0e0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1c0f0 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1c100 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c110 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1c120 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1c130 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1c140 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1c150 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1c160 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1c180 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1c190 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1c1a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1c1b0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1c1c0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1c1d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1c1e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1c1f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1c200 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c210 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1c220 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1c230 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1c240 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1c250 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1c260 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1c270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1c280 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1c290 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1c2a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1c2b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c2c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1c2d0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1c2e0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1c2f0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1c300 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1c310 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1c320 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1c330 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1c340 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1c350 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1c360 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1c370 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1c380 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1c390 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1c3a0 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1c3b0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1c3c0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1c3d0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1c3e0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1c3f0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1c400 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1c410 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1c420 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1c430 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1c440 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1c450 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1c460 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c470 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1c480 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1c490 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1c4a0 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1c4b0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1c4c0 67 65 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  ger) );..  asser
1c4d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c4e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1c4f0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1c500 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1c510 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1c520 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1c530 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1c540 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1c550 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1c560 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c570 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1c580 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1c590 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1c5a0 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1c5b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1c5c0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1c5d0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
1c5e0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
1c5f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1c600 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
1c610 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
1c620 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
1c630 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1c640 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
1c650 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
1c660 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1c670 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
1c680 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1c690 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
1c6a0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1c6b0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1c6c0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
1c6d0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
1c6e0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
1c6f0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1c700 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1c710 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1c720 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1c730 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1c740 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1c750 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1c760 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1c770 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1c780 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1c790 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c7a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1c7b0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1c7c0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1c7d0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1c7e0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1c7f0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1c800 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1c810 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1c820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1c830 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1c840 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1c850 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1c860 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1c870 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1c880 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1c890 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1c8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1c8b0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1c8c0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1c8d0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1c8e0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1c8f0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1c900 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1c910 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
1c920 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
1c930 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c940 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1c950 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1c960 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1c970 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1c980 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
1c990 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1c9a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1c9b0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1c9c0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1c9d0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
1c9e0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
1c9f0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
1ca00 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
1ca10 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
1ca20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ca30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1ca40 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1ca50 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1ca60 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
1ca70 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
1ca80 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
1ca90 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
1caa0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
1cab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1cac0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
1cad0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
1cae0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
1caf0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
1cb00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1cb10 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1cb20 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
1cb30 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1cb40 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
1cb50 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
1cb60 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
1cb70 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
1cb80 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
1cb90 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
1cba0 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
1cbb0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
1cbc0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
1cbd0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
1cbe0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
1cbf0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
1cc00 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
1cc10 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
1cc20 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
1cc30 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
1cc40 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
1cc50 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
1cc60 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
1cc70 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
1cc80 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
1cc90 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
1cca0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
1ccb0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
1ccc0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1ccd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1cce0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
1ccf0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
1cd00 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
1cd10 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1cd20 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
1cd30 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
1cd40 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
1cd50 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
1cd60 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
1cd70 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
1cd80 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
1cd90 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
1cda0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
1cdb0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
1cdc0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
1cdd0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
1cde0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
1cdf0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
1ce00 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1ce10 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
1ce20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
1ce30 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1ce40 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
1ce50 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
1ce60 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
1ce70 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
1ce80 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
1ce90 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1cea0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1ceb0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1cec0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
1ced0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
1cee0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
1cef0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
1cf00 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
1cf10 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
1cf20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
1cf30 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
1cf40 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
1cf50 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
1cf60 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
1cf70 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
1cf80 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1cf90 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
1cfa0 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
1cfb0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
1cfc0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
1cfd0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
1cfe0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
1cff0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
1d000 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
1d010 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
1d020 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
1d030 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
1d040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
1d050 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1d060 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1d070 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
1d080 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
1d090 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1d0a0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
1d0b0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1d0c0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
1d0d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1d0e0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
1d0f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
1d100 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d110 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1d120 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1d130 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
1d140 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
1d150 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
1d160 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d170 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1d180 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1d190 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1d1a0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1d1b0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
1d1c0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
1d1d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
1d1e0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
1d1f0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
1d200 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
1d210 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
1d220 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1d230 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
1d240 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
1d250 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
1d260 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1d270 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1d280 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1d290 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1d2a0 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
1d2b0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
1d2c0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
1d2d0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
1d2e0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
1d2f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
1d300 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
1d310 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
1d320 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
1d330 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1d340 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
1d350 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
1d360 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
1d370 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
1d380 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d390 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1d3a0 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
1d3b0 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
1d3c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1d3d0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
1d3e0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
1d3f0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
1d400 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
1d410 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
1d420 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
1d430 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
1d440 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
1d450 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
1d460 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
1d470 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
1d480 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
1d490 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
1d4a0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1d4b0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
1d4c0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
1d4d0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1d4e0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
1d4f0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
1d500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1d510 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
1d520 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
1d530 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
1d540 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
1d550 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1d560 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
1d570 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
1d580 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1d590 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
1d5a0 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
1d5b0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
1d5c0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
1d5d0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1d5e0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
1d5f0 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
1d600 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
1d610 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
1d620 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
1d630 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
1d640 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1d650 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1d660 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1d670 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
1d680 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
1d690 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
1d6a0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1d6b0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
1d6c0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1d6d0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
1d6e0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1d6f0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
1d700 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
1d710 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
1d720 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
1d730 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
1d740 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
1d750 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
1d760 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
1d770 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1d780 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1d790 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
1d7a0 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1d7b0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
1d7c0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
1d7d0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
1d7e0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
1d7f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1d800 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1d810 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
1d820 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
1d830 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
1d840 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1d850 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
1d860 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1d870 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
1d880 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
1d890 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
1d8a0 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
1d8b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1d8c0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
1d8d0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
1d8e0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
1d8f0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
1d900 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
1d910 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
1d920 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
1d930 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
1d940 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
1d950 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
1d960 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
1d970 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
1d980 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
1d990 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
1d9a0 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
1d9b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1d9c0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
1d9d0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
1d9e0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
1d9f0 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
1da00 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
1da10 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1da20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
1da30 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
1da40 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
1da50 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
1da60 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
1da70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1da80 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
1da90 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
1daa0 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
1dab0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
1dac0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
1dad0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
1dae0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
1daf0 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
1db00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
1db10 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
1db20 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
1db30 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
1db40 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
1db50 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1db60 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
1db70 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
1db80 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1db90 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
1dba0 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
1dbb0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
1dbc0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
1dbd0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
1dbe0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
1dbf0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
1dc00 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
1dc10 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
1dc20 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
1dc30 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1dc40 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
1dc50 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
1dc60 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
1dc70 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
1dc80 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
1dc90 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
1dca0 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
1dcb0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
1dcc0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
1dcd0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
1dce0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1dcf0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
1dd00 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
1dd10 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
1dd20 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
1dd30 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
1dd40 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1dd50 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
1dd60 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
1dd70 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
1dd80 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
1dd90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1dda0 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
1ddb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1ddc0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1ddd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
1dde0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
1ddf0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
1de00 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
1de10 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
1de20 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
1de30 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
1de40 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1de50 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
1de60 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1de70 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1de80 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
1de90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1dea0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
1deb0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1dec0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1ded0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1dee0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1def0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
1df00 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1df10 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
1df20 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1df30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
1df40 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
1df50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1df60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
1df70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1df80 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
1df90 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
1dfa0 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
1dfb0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
1dfc0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
1dfd0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1dfe0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
1dff0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
1e000 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
1e010 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
1e020 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
1e030 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1e040 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1e050 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1e060 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
1e070 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
1e080 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1e090 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
1e0a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1e0b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1e0c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1e0d0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1e0e0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
1e0f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e100 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1e110 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1e120 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
1e130 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
1e140 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
1e150 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e160 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
1e170 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
1e180 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
1e190 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
1e1a0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
1e1b0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
1e1c0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
1e1d0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
1e1e0 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
1e1f0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
1e200 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
1e210 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
1e220 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
1e230 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
1e240 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
1e250 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
1e260 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
1e270 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
1e280 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
1e290 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
1e2a0 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
1e2b0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1e2c0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
1e2d0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
1e2e0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
1e2f0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
1e300 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
1e310 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
1e320 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
1e330 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
1e340 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
1e350 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
1e360 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
1e370 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
1e380 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
1e390 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
1e3a0 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
1e3b0 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
1e3c0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
1e3d0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
1e3e0 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
1e3f0 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
1e400 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
1e410 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
1e420 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
1e430 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
1e440 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
1e450 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
1e460 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
1e470 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
1e480 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
1e490 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
1e4a0 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
1e4b0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
1e4c0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
1e4d0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
1e4e0 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
1e4f0 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
1e500 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
1e510 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
1e520 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
1e530 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1e540 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
1e550 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
1e560 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
1e570 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
1e580 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
1e590 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
1e5a0 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
1e5b0 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
1e5c0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1e5d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
1e5e0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
1e5f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
1e600 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
1e610 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
1e620 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
1e630 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
1e640 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
1e650 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
1e660 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
1e670 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
1e680 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
1e690 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
1e6a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
1e6b0 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
1e6c0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
1e6d0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
1e6e0 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
1e6f0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
1e700 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1e710 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1e720 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
1e730 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1e740 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1e750 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
1e760 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20  f( writeOnly && 
1e770 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  (p->curFlags & B
1e780 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
1e790 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
1e7a0 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
1e7b0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
1e7c0 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 43        rc = saveC
1e7d0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
1e7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e7f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e800 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  .            (vo
1e810 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65 54  id)sqlite3BtreeT
1e820 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  ripAllCursors(pB
1e830 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20  tree, rc, 0);.  
1e840 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1e850 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1e870 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
1e880 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
1e890 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20  sor(p);.        
1e8a0 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
1e8b0 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20  OR_FAULT;.      
1e8c0 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20    p->skipNext = 
1e8d0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d  errCode;.      }
1e8e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1e8f0 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  i<=p->iPage; i++
1e900 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
1e910 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
1e920 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  [i]);.        p-
1e930 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
1e940 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e950 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1e960 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
1e970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e980 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1e990 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1e9a0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
1e9b0 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  ** If tripCode i
1e9c0 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20  s not SQLITE_OK 
1e9d0 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c  then cursors wil
1e9e0 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  l be invalidated
1e9f0 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f   (tripped)..** O
1ea00 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
1ea10 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66  s are tripped if
1ea20 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72   writeOnly is tr
1ea30 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f  ue but all curso
1ea40 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65  rs are.** trippe
1ea50 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  d if writeOnly i
1ea60 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74  s false.  Any at
1ea70 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20  tempt to use.** 
1ea80 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72  a tripped cursor
1ea90 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
1eaa0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
1eab0 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
1eac0 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1ead0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1eae0 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
1eaf0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
1eb00 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
1eb10 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
1eb20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
1eb30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
1eb40 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c  llback(Btree *p,
1eb50 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69   int tripCode, i
1eb60 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20  nt writeOnly){. 
1eb70 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
1eb80 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
1eb90 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
1eba0 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  age1;..  assert(
1ebb0 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c   writeOnly==1 ||
1ebc0 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b   writeOnly==0 );
1ebd0 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43  .  assert( tripC
1ebe0 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52  ode==SQLITE_ABOR
1ebf0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72  T_ROLLBACK || tr
1ec00 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
1ec10 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  K );.  sqlite3Bt
1ec20 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
1ec30 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  f( tripCode==SQL
1ec40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
1ec50 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61   = tripCode = sa
1ec60 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1ec70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
1ec80 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20   rc ) writeOnly 
1ec90 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1eca0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ecb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70  ;.  }.  if( trip
1ecc0 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  Code ){.    int 
1ecd0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
1ece0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
1ecf0 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72  (p, tripCode, wr
1ed00 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73  iteOnly);.    as
1ed10 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1ed20 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c  _OK || (writeOnl
1ed30 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c  y==0 && rc2==SQL
1ed40 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69  ITE_OK) );.    i
1ed50 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
1ed60 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
1ed70 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  }.  btreeIntegri
1ed80 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d  ty(p);..  if( p-
1ed90 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1eda0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1edb0 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72   rc2;..    asser
1edc0 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d  t( TRANS_WRITE==
1edd0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1ede0 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  on );.    rc2 = 
1edf0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1ee00 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72  back(pBt->pPager
1ee10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
1ee20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ee30 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
1ee40 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72   }..    /* The r
1ee50 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
1ee60 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70   destroyed the p
1ee70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c  Page1->aData val
1ee80 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63  ue.  So.    ** c
1ee90 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65  all btreeGetPage
1eea0 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61  () on page 1 aga
1eeb0 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a  in to make.    *
1eec0 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61  * sure pPage1->a
1eed0 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72  Data is set corr
1eee0 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66  ectly. */.    if
1eef0 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  ( btreeGetPage(p
1ef00 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
1ef10 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
1ef20 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
1ef30 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28   = get4byte(28+(
1ef40 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
1ef50 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  a);.      testca
1ef60 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a  se( nPage==0 );.
1ef70 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d        if( nPage=
1ef80 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  =0 ) sqlite3Page
1ef90 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
1efa0 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
1efb0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1efc0 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61   pBt->nPage!=nPa
1efd0 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge );.      pBt-
1efe0 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
1eff0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1f000 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d  e(pPage1);.    }
1f010 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75  .    assert( cou
1f020 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
1f030 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20  Bt, 1)==0 );.   
1f040 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1f050 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1f060 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
1f070 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
1f080 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1f090 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1f0a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1f0b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1f0c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
1f0d0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
1f0e0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
1f0f0 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
1f100 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  on can be rolled
1f110 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
1f120 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
1f130 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
1f140 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
1f150 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
1f160 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
1f170 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
1f180 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
1f190 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
1f1a0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
1f1b0 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
1f1c0 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
1f1d0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
1f1e0 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
1f1f0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
1f200 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
1f210 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
1f220 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
1f230 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
1f240 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
1f250 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
1f260 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
1f270 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
1f280 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
1f290 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
1f2a0 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
1f2b0 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
1f2c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
1f2d0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
1f2e0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
1f2f0 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
1f300 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
1f310 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
1f320 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
1f330 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
1f340 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
1f350 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
1f360 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
1f370 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
1f380 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
1f390 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
1f3a0 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
1f3b0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
1f3c0 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
1f3d0 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
1f3e0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
1f3f0 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
1f400 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
1f410 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
1f420 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
1f430 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
1f440 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
1f450 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
1f460 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
1f470 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
1f480 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
1f490 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
1f4a0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1f4b0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1f4c0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
1f4d0 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
1f4e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1f4f0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f500 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
1f510 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
1f520 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
1f530 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1f540 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
1f550 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1f560 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b  READ_ONLY)==0 );
1f570 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
1f580 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73  ement>0 );.  ass
1f590 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
1f5a0 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
1f5b0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
1f5c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1f5d0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
1f5e0 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61  ;.  /* At the pa
1f5f0 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61  ger level, a sta
1f600 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1f610 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e  on is a savepoin
1f620 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69  t with.  ** an i
1f630 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
1f640 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
1f650 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
1f660 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53  tly using.  ** S
1f670 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49  QL statements. I
1f680 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
1f690 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72  open, release or
1f6a0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20   rollback any.  
1f6b0 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
1f6c0 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
1f6d0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1f6e0 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
1f6f0 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72  active..  */.  r
1f700 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f710 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
1f720 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
1f730 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65  ement);.  sqlite
1f740 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1f750 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f760 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64  /*.** The second
1f770 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1f780 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20  s function, op, 
1f790 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f  is always SAVEPO
1f7a0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20  INT_ROLLBACK.** 
1f7b0 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  or SAVEPOINT_REL
1f7c0 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74  EASE. This funct
1f7d0 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61  ion either relea
1f7e0 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  ses or rolls bac
1f7f0 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69  k the.** savepoi
1f800 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  nt identified by
1f810 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65   parameter iSave
1f820 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67  point, depending
1f830 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a   on the value .*
1f840 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e  * of op..**.** N
1f850 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f  ormally, iSavepo
1f860 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74  int is greater t
1f870 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1f880 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69  zero. However, i
1f890 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50  f op is.** SAVEP
1f8a0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
1f8b0 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d  hen iSavepoint m
1f8c0 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49  ay also be -1. I
1f8d0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
1f8e0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
1f8f0 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1f900 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65  action are rolle
1f910 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
1f920 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f  different.** fro
1f930 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73  m a normal trans
1f940 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c  action rollback,
1f950 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65   as no locks are
1f960 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68   released and th
1f970 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1f980 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a   remains open..*
1f990 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1f9a0 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65  eeSavepoint(Btre
1f9b0 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1f9c0 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20  t iSavepoint){. 
1f9d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f9e0 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20  _OK;.  if( p && 
1f9f0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1fa00 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
1fa10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fa20 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
1fa30 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  t( op==SAVEPOINT
1fa40 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d  _RELEASE || op==
1fa50 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1fa60 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CK );.    assert
1fa70 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20  ( iSavepoint>=0 
1fa80 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d  || (iSavepoint==
1fa90 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f  -1 && op==SAVEPO
1faa0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b  INT_ROLLBACK) );
1fab0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1fac0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
1fad0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fae0 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
1faf0 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65  Pager, op, iSave
1fb00 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  point);.    if( 
1fb10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fb20 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76 65  .      if( iSave
1fb30 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d  point<0 && (pBt-
1fb40 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1fb50 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29  INITIALLY_EMPTY)
1fb60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1fb70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
1fb80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
1fb90 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1fba0 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  t);.      pBt->n
1fbb0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1fbc0 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31  28 + pBt->pPage1
1fbd0 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  ->aData);..     
1fbe0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
1fbf0 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74 65   size was writte
1fc00 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65  n into the offse
1fc10 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61 64  t 28 of the head
1fc20 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e  er.      ** when
1fc30 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1fc40 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20   started, so we 
1fc50 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76 61  know that the va
1fc60 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20  lue at offset.  
1fc70 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e      ** 28 is non
1fc80 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61  zero. */.      a
1fc90 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67  ssert( pBt->nPag
1fca0 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e>0 );.    }.   
1fcb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1fcc0 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
1fcd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1fce0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
1fcf0 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
1fd00 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
1fd10 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
1fd20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61  iTable. If a rea
1fd30 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73  d-only cursor is
1fd40 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
1fd50 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
1fd60 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72  * the caller alr
1fd70 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61 73  eady has at leas
1fd80 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  t a read-only tr
1fd90 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a  ansaction open.*
1fda0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
1fdb0 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20  e already. If a 
1fdc0 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
1fdd0 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a  requested, then.
1fde0 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  ** the caller is
1fdf0 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65   assumed to have
1fe00 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
1fe10 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1fe20 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20  * If wrFlag==0, 
1fe30 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
1fe40 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  can only be used
1fe50 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a   for reading..**
1fe60 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74   If wrFlag==1, t
1fe70 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63  hen the cursor c
1fe80 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
1fe90 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a  eading or for.**
1fea0 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
1feb0 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
1fec0 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c 73   writing are als
1fed0 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a  o met.  These.**
1fee0 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
1fef0 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
1ff00 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66 6f   met in order fo
1ff10 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  r writing to.** 
1ff20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
1ff30 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
1ff40 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
1ff50 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
1ff60 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20  ag==1.**.** 2:  
1ff70 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  Other database c
1ff80 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1ff90 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70  share the same p
1ffa0 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20  ager cache.**   
1ffb0 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20    but which are 
1ffc0 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f  not in the READ_
1ffd0 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74  UNCOMMITTED stat
1ffe0 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a  e may not have.*
1fff0 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70  *     cursors op
20000 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  en with wrFlag==
20010 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61  0 on the same ta
20020 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a  ble.  Otherwise.
20030 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67  **     the chang
20040 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  es made by this 
20050 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75  write cursor wou
20060 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f  ld be visible to
20070 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64  .**     the read
20080 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
20090 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
200a0 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
200b0 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73   3:  The databas
200c0 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62  e must be writab
200d0 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d  le (not on read-
200e0 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a  only media).**.*
200f0 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74  * 4:  There must
20100 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72   be an active tr
20110 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
20120 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20   No checking is 
20130 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  done to make sur
20140 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62  e that page iTab
20150 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65  le really is the
20160 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  .** root page of
20170 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69   a b-tree.  If i
20180 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74  t is not, then t
20190 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72  he cursor acquir
201a0 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77  ed.** will not w
201b0 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ork correctly..*
201c0 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d  *.** It is assum
201d0 65 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ed that the sqli
201e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
201f0 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61  ro() has been ca
20200 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20  lled.** on pCur 
20210 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
20220 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70  e memory space p
20230 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
20240 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
20250 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
20260 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
20270 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
20280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20290 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
202a0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
202d0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
202e0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
202f0 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
20320 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
20330 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
20340 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
20350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20360 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
20370 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
20380 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
20390 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
203a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
203b0 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
203c0 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  rsor */.){.  BtS
203d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
203e0 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
203f0 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d      /* Shared b-
20400 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 0a  tree handle */..
20410 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20420 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
20430 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
20440 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
20450 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  Flag==1 );..  /*
20460 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
20470 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73  ssert statements
20480 20 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20   verify that if 
20490 74 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62  this is a sharab
204a0 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20  le .  ** b-tree 
204b0 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f  database, the co
204c0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64  nnection is hold
204d0 69 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64  ing the required
204e0 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20   table locks, . 
204f0 20 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20   ** and that no 
20500 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
20510 20 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75   has any open cu
20520 72 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69  rsor that confli
20530 63 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74  cts with .  ** t
20540 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20  his lock.  */.  
20550 61 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65  assert( hasShare
20560 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
20570 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49  p, iTable, pKeyI
20580 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31  nfo!=0, wrFlag+1
20590 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
205a0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73  rFlag==0 || !has
205b0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
205c0 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f   iTable) );..  /
205d0 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
205e0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65  e caller has ope
205f0 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65 64  ned the required
20600 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f   transaction. */
20610 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
20620 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
20630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
20640 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e  Flag==0 || p->in
20650 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
20660 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
20670 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70  pBt->pPage1 && p
20680 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20690 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  a );..  if( NEVE
206a0 52 28 77 72 46 6c 61 67 20 26 26 20 28 70 42 74  R(wrFlag && (pBt
206b0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
206c0 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 29 20  _READ_ONLY)!=0) 
206d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
206e0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
206f0 20 7d 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20   }.  if( wrFlag 
20700 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  ){.    allocateT
20710 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
20720 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
20730 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Space==0 ) retur
20740 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
20750 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65    }.  if( iTable
20760 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65  ==1 && btreePage
20770 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b  count(pBt)==0 ){
20780 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46  .    assert( wrF
20790 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54  lag==0 );.    iT
207a0 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  able = 0;.  }.. 
207b0 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
207c0 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
207d0 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
207e0 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
207f0 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
20800 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74  ables and link t
20810 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
20820 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
20830 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67  .  */.  pCur->pg
20840 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
20850 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69  Table;.  pCur->i
20860 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75  Page = -1;.  pCu
20870 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
20880 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e  eyInfo;.  pCur->
20890 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
208a0 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ur->pBt = pBt;. 
208b0 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
208c0 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54  =0 || wrFlag==BT
208d0 43 46 5f 57 72 69 74 65 46 6c 61 67 20 29 3b 0a  CF_WriteFlag );.
208e0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
208f0 20 3d 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75   = wrFlag;.  pCu
20900 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
20910 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
20920 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
20930 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
20940 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
20950 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
20960 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
20970 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
20980 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
20990 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
209a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
209b0 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
209c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
209d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209e0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
209f0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
20a00 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
20a30 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
20a40 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
20a50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a70 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
20a80 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
20a90 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
20aa0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ac0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
20ad0 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
20ae0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
20af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
20b10 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
20b20 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
20b30 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
20b40 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
20b50 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
20b60 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
20b70 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
20b80 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
20b90 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
20ba0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20bb0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
20bc0 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
20bd0 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
20be0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
20bf0 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
20c00 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
20c10 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
20c20 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
20c30 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
20c40 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
20c50 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
20c60 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
20c70 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
20c80 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
20c90 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
20ca0 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
20cb0 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
20cc0 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
20cd0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
20ce0 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
20cf0 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
20d00 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
20d10 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
20d20 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
20d30 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
20d40 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
20d50 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
20d60 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
20d70 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
20d80 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
20d90 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
20da0 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
20db0 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
20dc0 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
20dd0 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
20de0 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
20df0 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
20e00 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
20e10 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
20e20 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
20e30 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
20e40 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
20e50 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
20e60 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
20e70 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
20e80 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
20e90 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
20ea0 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
20eb0 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
20ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
20ed0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
20ee0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
20ef0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
20f00 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
20f10 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
20f20 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
20f30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
20f40 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
20f50 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
20f60 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
20f70 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
20f80 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
20f90 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
20fa0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
20fb0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
20fc0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
20fd0 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
20fe0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
20ff0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
21000 70 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20  pCur->pPrev ){. 
21010 20 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76       pCur->pPrev
21020 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e  ->pNext = pCur->
21030 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
21040 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75  {.      pBt->pCu
21050 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65  rsor = pCur->pNe
21060 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
21070 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
21080 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65  .      pCur->pNe
21090 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72  xt->pPrev = pCur
210a0 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20  ->pPrev;.    }. 
210b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70     for(i=0; i<=p
210c0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
210d0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
210e0 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65  age(pCur->apPage
210f0 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
21100 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
21110 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71  sed(pBt);.    sq
21120 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
21130 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  >aOverflow);.   
21140 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
21150 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
21160 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21170 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
21180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
211a0 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
211b0 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
211c0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
211d0 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
211e0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
211f0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
21200 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
21210 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  ll.** btreeParse
21220 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69  Cell() to fill i
21230 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75  t in..**.** BtCu
21240 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63  rsor.info is a c
21250 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f  ache of the info
21260 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63  rmation in the c
21270 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20  urrent cell..** 
21280 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65  Using this cache
21290 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d   reduces the num
212a0 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20  ber of calls to 
212b0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
212c0 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d  ..**.** 2007-06-
212d0 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20  25:  There is a 
212e0 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73  bug in some vers
212f0 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61  ions of MSVC tha
21300 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63  t cause the.** c
21310 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68  ompiler to crash
21320 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66   when getCellInf
21330 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  o() is implement
21340 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a  ed as a macro..*
21350 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61  * But there is a
21360 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65   measureable spe
21370 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20  ed advantage to 
21380 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20  using the macro 
21390 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20  on gcc.** (when 
213a0 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70  less compiler op
213b0 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65  timizations like
213c0 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20   -Os or -O0 are 
213d0 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  used and the.** 
213e0 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20  compiler is not 
213f0 64 6f 69 6e 67 20 61 67 67 72 65 73 73 69 76 65  doing aggressive
21400 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
21410 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
21420 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
21430 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
21440 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
21450 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
21460 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
21470 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
21480 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
21490 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
214a0 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
214b0 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
214c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
214d0 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
214e0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
214f0 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
21500 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
21510 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
21520 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
21530 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
21540 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
21550 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
21560 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
21570 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
21580 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
21590 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
215a0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
215b0 0a 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52  .#ifdef _MSC_VER
215c0 0a 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c  .  /* Use a real
215d0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56   function in MSV
215e0 43 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  C to work around
215f0 20 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f   bugs in that co
21600 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61  mpiler. */.  sta
21610 74 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  tic void getCell
21620 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
21630 43 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43  Cur){.    if( pC
21640 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
21650 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
21660 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
21670 67 65 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50  ge;.      btreeP
21680 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
21690 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
216a0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
216b0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
216c0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
216d0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
216e0 4e 4b 65 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  NKey;.    }else{
216f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
21700 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
21710 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
21720 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
21730 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
21740 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
21750 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
21760 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
21770 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
21780 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
21790 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
217a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
217d0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
217e0 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
21820 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
21830 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
21870 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
21880 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
21890 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
218a0 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
218b0 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20  ->info);        
218c0 5c 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46  \.    pCur->curF
218d0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
218e0 69 64 4e 4b 65 79 3b 20 20 20 20 20 20 20 20 20  idNKey;         
218f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21910 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21960 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
21970 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219b0 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
219c0 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
219d0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
219e0 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
219f0 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
21a00 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
21a10 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
21a20 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
21a30 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
21a40 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
21a50 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
21a60 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
21a70 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
21a80 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
21a90 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
21aa0 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
21ab0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
21ac0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
21ad0 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
21ae0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
21af0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21b00 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
21b10 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
21b20 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
21b30 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
21b40 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
21b50 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
21b60 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
21b70 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
21b80 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
21b90 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
21ba0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
21bb0 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
21bc0 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
21bd0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
21be0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
21bf0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
21c00 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
21c10 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
21c20 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
21c30 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
21c40 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
21c50 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
21c60 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
21c70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
21c80 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
21c90 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
21ca0 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68  must position th
21cb0 65 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74  e cursor prior t
21cc0 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
21cd0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20  routine..** .** 
21ce0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
21cf0 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c  not fail.  It al
21d00 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c  ways returns SQL
21d10 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74  ITE_OK.  .*/.int
21d20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
21d30 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
21d40 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
21d50 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
21d60 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
21d70 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
21d80 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
21d90 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
21da0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
21db0 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  );.  *pSize = pC
21dc0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
21dd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21de0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
21df0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75  *pSize to the nu
21e00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
21e10 20 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74   data in the ent
21e20 72 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  ry the.** cursor
21e30 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
21e40 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  s to..**.** The 
21e50 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72  caller must guar
21e60 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63  antee that the c
21e70 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
21e80 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a  g to a non-NULL.
21e90 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20  ** valid entry. 
21ea0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
21eb0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
21ec0 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72  cedure must guar
21ed0 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68  antee.** that th
21ee0 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72  e cursor has Cur
21ef0 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53  sor.eState==CURS
21f00 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
21f10 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
21f20 6f 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66  ossible.  This f
21f30 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72  unction always r
21f40 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
21f50 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75  ..** It might ju
21f60 73 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20  st as well be a 
21f70 70 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72  procedure (retur
21f80 6e 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77  ning void) but w
21f90 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f  e continue.** to
21fa0 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67   return an integ
21fb0 65 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66  er result code f
21fc0 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65  or historical re
21fd0 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  asons..*/.int sq
21fe0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
21ff0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
22000 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
22010 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
22020 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
22030 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
22040 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
22050 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
22060 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
22070 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
22080 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29  >intKeyLeaf==1 )
22090 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
220a0 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
220b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
220c0 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
220d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
220e0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61  .** Given the pa
220f0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  ge number of an 
22100 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
22110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70   the database (p
22120 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c  arameter.** ovfl
22130 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
22140 20 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20   finds the page 
22150 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
22160 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a  xt page in the .
22170 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ** linked list o
22180 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
22190 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69  . If possible, i
221a0 74 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d  t uses the auto-
221b0 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65  vacuum.** pointe
221c0 72 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65  r-map data inste
221d0 61 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68  ad of reading th
221e0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67  e content of pag
221f0 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e  e ovfl to do so.
22200 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
22210 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51  ror occurs an SQ
22220 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
22230 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
22240 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68  erwise:.**.** Th
22250 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
22260 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c   the next overfl
22270 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
22280 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a  inked list is .*
22290 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50  * written to *pP
222a0 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65  gnoNext. If page
222b0 20 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73   ovfl is the las
222c0 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
222d0 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a  nked .** list, *
222e0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
222f0 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
22300 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
22310 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65  t NULL, and a re
22320 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d  ference to the M
22330 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f  emPage object co
22340 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
22350 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f  o page number pO
22360 76 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64  vfl was obtained
22370 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
22380 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
22390 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65  o that.** refere
223a0 6e 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72  nce. It is the r
223b0 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
223c0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63   the caller to c
223d0 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28  all releasePage(
223e0 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20  ).** on *ppPage 
223f0 74 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65  to free the refe
22400 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66  rence. In no ref
22410 65 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69  erence was obtai
22420 6e 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ned (because.** 
22430 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
22440 77 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61  was used to obta
22450 69 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72  in the value for
22460 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68   *pPgnoNext), th
22470 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73  en.** *ppPage is
22480 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f   set to zero..*/
22490 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f  .static int getO
224a0 76 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42  verflowPage(.  B
224b0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
224c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
224d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
224e0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c   */.  Pgno ovfl,
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76     /* Current ov
22510 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
22520 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  er */.  MemPage 
22530 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20  **ppPage,       
22540 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d       /* OUT: Mem
22550 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79  Page handle (may
22560 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50   be NULL) */.  P
22570 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20  gno *pPgnoNext  
22580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
22590 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f  UT: Next overflo
225a0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
225b0 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20  .){.  Pgno next 
225c0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
225d0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pPage = 0;.  int
225e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
225f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
22600 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
22610 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
22620 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74  assert(pPgnoNext
22630 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
22640 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
22650 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  UM.  /* Try to f
22660 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67  ind the next pag
22670 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
22680 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65  w list using the
22690 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d  .  ** autovacuum
226a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
226b0 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74  es. Guess that t
226c0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
226d0 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  .  ** the overfl
226e0 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20  ow list is page 
226f0 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e  number (ovfl+1).
22700 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74   If that guess t
22710 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74  urns .  ** out t
22720 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c  o be wrong, fall
22730 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67   back to loading
22740 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67   the data of pag
22750 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  e .  ** number o
22760 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  vfl to determine
22770 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e   the next page n
22780 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  umber..  */.  if
22790 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
227a0 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
227b0 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75  no;.    Pgno iGu
227c0 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20  ess = ovfl+1;.  
227d0 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20    u8 eType;..   
227e0 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49   while( PTRMAP_I
227f0 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73  SPAGE(pBt, iGues
22800 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45  s) || iGuess==PE
22810 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
22820 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47  pBt) ){.      iG
22830 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  uess++;.    }.. 
22840 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62     if( iGuess<=b
22850 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
22860 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  t) ){.      rc =
22870 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
22880 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20  iGuess, &eType, 
22890 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  &pgno);.      if
228a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
228b0 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
228c0 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67  _OVERFLOW2 && pg
228d0 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20  no==ovfl ){.    
228e0 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73      next = iGues
228f0 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
22900 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
22910 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
22920 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
22930 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d   next==0 || rc==
22940 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
22950 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22960 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
22970 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
22980 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28   ovfl, &pPage, (
22990 70 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47  ppPage==0) ? PAG
229a0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
229b0 3a 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  : 0);.    assert
229c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
229d0 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20  || pPage==0 );. 
229e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
229f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65  E_OK ){.      ne
22a00 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50  xt = get4byte(pP
22a10 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
22a20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f   }.  }..  *pPgno
22a30 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69  Next = next;.  i
22a40 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20  f( ppPage ){.   
22a50 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
22a60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
22a70 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
22a80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
22a90 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
22aa0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72   ? SQLITE_OK : r
22ab0 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  c);.}../*.** Cop
22ac0 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
22ad0 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
22ae0 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
22af0 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
22b00 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
22b10 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
22b20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
22b30 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
22b40 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
22b50 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
22b60 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
22b70 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
22b80 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
22b90 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
22ba0 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
22bb0 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
22bc0 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
22bd0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
22be0 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
22bf0 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
22c00 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
22c10 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
22c20 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
22c30 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
22c40 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
22c50 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
22c60 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
22c70 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
22c80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
22c90 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
22ca0 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
22cb0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22cc0 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
22cd0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
22ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22cf0 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
22d00 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
22d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22d20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
22d30 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
22d40 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
22d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
22d60 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
22d70 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
22d80 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
22d90 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
22da0 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
22db0 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
22dc0 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
22dd0 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
22de0 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
22df0 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
22e00 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
22e10 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
22e20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
22e30 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
22e40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22e50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
22e60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
22e70 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
22e80 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
22e90 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
22ea0 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
22eb0 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
22ec0 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
22ed0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
22ee0 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
22ef0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
22f00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22f10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
22f20 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
22f30 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
22f40 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
22f50 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
22f60 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
22f70 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
22f80 69 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a  ing to. The eOp.
22f90 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
22fa0 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f  nterpreted as fo
22fb0 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30  llows:.**.**   0
22fc0 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
22fd0 69 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c  is a read. Popul
22fe0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
22ff0 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20   cache..**   1: 
23000 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
23010 20 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61   a write. Popula
23020 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
23030 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54  cache..**   2: T
23040 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
23050 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70  a read. Do not p
23060 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
23070 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  flow cache..**.*
23080 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
23090 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
230a0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
230b0 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
230c0 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
230d0 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
230e0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
230f0 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e  **.** The conten
23100 74 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20  t being read or 
23110 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70  written might ap
23120 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
23130 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73   page.** or be s
23140 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
23150 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
23160 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  w pages..**.** I
23170 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  f the current cu
23180 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20  rsor entry uses 
23190 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
231a0 66 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74  flow pages and t
231b0 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65  he.** eOp argume
231c0 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69  nt is not 2, thi
231d0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
231e0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
231f0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a  r and lazily .**
23200 20 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f   populates the o
23210 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
23220 74 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  t cache array (B
23230 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
23240 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65  w). .** Subseque
23250 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69  nt calls use thi
23260 73 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  s cache to make 
23270 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
23280 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a  upplied offset .
23290 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  ** more efficien
232a0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
232b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
232c0 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
232d0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
232e0 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
232f0 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
23300 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
23310 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
23320 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
23330 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
23340 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
23350 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
23360 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
23370 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
23380 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
23390 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
233a0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
233b0 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
233c0 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
233d0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
233e0 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
233f0 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
23400 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
23410 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
23420 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
23430 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
23440 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
23450 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
23460 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
23470 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
23480 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
23490 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
234a0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  d from */.  u32 
234b0 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
234c0 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
234d0 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
234e0 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32  payload */.  u32
234f0 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
23500 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
23510 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
23520 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
23530 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
23540 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
23550 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
23560 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
23570 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
23580 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
23590 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
235a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
235b0 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
235c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
235d0 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
235e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
235f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
23600 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
23610 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
23620 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
23630 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23640 70 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20  pCur->pBt;      
23650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
23660 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
23670 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23   belongs to */.#
23680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
23690 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
236a0 44 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  D.  unsigned cha
236b0 72 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74  r * const pBufSt
236c0 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e  art = pBuf;.  in
236d0 74 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20  t bEnd;         
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
23700 69 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e  if reading to en
23710 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e  d of data */.#en
23720 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
23730 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
23740 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23750 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23760 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23770 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
23780 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
23790 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
237a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
237b0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
237c0 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65   eOp!=2 || offse
237d0 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c  t==0 );    /* Al
237e0 77 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20  ways start from 
237f0 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f  beginning for eO
23800 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65  p==2 */..  getCe
23810 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
23820 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d  aPayload = pCur-
23830 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
23840 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
23850 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
23860 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73  AD.  bEnd = offs
23870 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e  et+amt==pCur->in
23880 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e  fo.nPayload;.#en
23890 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66  dif.  assert( of
238a0 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72  fset+amt <= pCur
238b0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ->info.nPayload 
238c0 29 3b 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c  );..  if( &aPayl
238d0 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
238e0 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
238f0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
23900 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f  leSize] ){.    /
23910 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
23920 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
23930 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
23940 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
23950 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
23960 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23970 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
23980 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62  k if data must b
23990 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74  e read/written t
239a0 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65  o/from the btree
239b0 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f   page itself. */
239c0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43  .  if( offset<pC
239d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
239e0 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61  ){.    int a = a
239f0 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66  mt;.    if( a+of
23a00 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset>pCur->info.
23a10 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  nLocal ){.      
23a20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  a = pCur->info.n
23a30 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a  Local - offset;.
23a40 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63      }.    rc = c
23a50 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
23a60 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42  load[offset], pB
23a70 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78  uf, a, (eOp & 0x
23a80 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  01), pPage->pDbP
23a90 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
23aa0 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
23ab0 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
23ac0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
23ad0 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
23ae0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
23af0 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
23b00 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
23b10 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
23b20 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
23b30 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
23b40 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
23b50 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
23b60 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
23b70 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
23b80 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
23b90 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
23ba0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
23bb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74      /* If the Bt
23bc0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
23bd0 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  [] has not been 
23be0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
23bf0 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20  ate it now..    
23c00 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f  ** Except, do no
23c10 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72  t allocate aOver
23c20 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d  flow[] for eOp==
23c30 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
23c40 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   The aOverflow[]
23c50 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20   array is sized 
23c60 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72  at one entry for
23c70 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70   each overflow p
23c80 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  age.    ** in th
23c90 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
23ca0 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  . The page numbe
23cb0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  r of the first o
23cc0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a  verflow page is.
23cd0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e      ** stored in
23ce0 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65   aOverflow[0], e
23cf0 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30  tc. A value of 0
23d00 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f   in the aOverflo
23d10 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a  w[] array.    **
23d20 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20   means "not yet 
23d30 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68  known" (the cach
23d40 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75  e is lazily popu
23d50 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20  lated)..    */. 
23d60 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26     if( eOp!=2 &&
23d70 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
23d80 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
23d90 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)==0 ){.      i
23da0 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
23db0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
23dc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
23dd0 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
23de0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  flSize;.      if
23df0 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f  ( nOvfl>pCur->nO
23e00 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  vflAlloc ){.    
23e10 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
23e20 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
23e30 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
23e40 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
23e50 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
23e60 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
23e70 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
23e80 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
23e90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23ea0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
23eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23ec0 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
23ed0 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
23ee0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
23ef0 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
23f00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23f10 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
23f20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23f30 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
23f40 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
23f50 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
23f60 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  o));.        pCu
23f70 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
23f80 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
23f90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
23fa0 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
23fb0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
23fc0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
23fd0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
23fe0 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
23ff0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
24000 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
24010 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
24020 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
24030 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
24040 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
24050 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
24060 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20  lidOvfl)!=0.    
24070 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
24080 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
24090 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize].    ){.    
240a0 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
240b0 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
240c0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
240d0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
240e0 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
240f0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
24100 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize);.    }..   
24110 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
24120 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
24130 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
24140 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ++){..      /* I
24150 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
24160 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
24170 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
24180 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
24190 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
241a0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
241b0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
241c0 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
241d0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
241e0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
241f0 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
24200 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
24210 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
24220 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
24230 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
24240 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
24250 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
24260 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
24270 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
24280 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
24290 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
242a0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
242b0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
242c0 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
242d0 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
242e0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
242f0 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
24300 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
24310 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
24320 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
24330 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
24340 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
24350 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
24360 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
24370 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
24380 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
24390 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
243a0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
243b0 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61   array must be a
243c0 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65  llocated because
243d0 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20   eOp!=2.        
243e0 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70  ** here.  If eOp
243f0 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74  ==2, then offset
24400 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61  ==0 and this bra
24410 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b  nch is never tak
24420 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  en..        */. 
24430 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
24440 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  Op!=2 );.       
24450 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
24460 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
24470 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
24480 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
24490 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
244a0 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
244b0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
244c0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
244d0 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
244e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
244f0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
24500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24510 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
24520 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
24530 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
24540 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
24550 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
24560 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
24570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24580 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
24590 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
245a0 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
245b0 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
245c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
245d0 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
245e0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
245f0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
24600 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
24610 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
24620 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
24630 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
24640 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
24650 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
24660 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
24670 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
24680 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
24690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
246a0 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
246b0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
246c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
246d0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
246e0 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
246f0 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
24700 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
24710 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
24720 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
24730 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
24740 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
24750 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
24760 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
24770 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
24780 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
24790 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
247a0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
247b0 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
247c0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
247d0 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
247e0 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
247f0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
24800 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
24810 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
24820 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
24830 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
24840 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
24850 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
24860 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ead..        ** 
24870 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20    7) at least 4 
24880 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
24890 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
248a0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
248b0 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
248c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
248d0 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
248e0 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
248f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
24900 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
24910 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
24920 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
24930 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
24940 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
24950 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
24960 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
24970 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
24980 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
24990 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
249a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
249b0 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20  eOp&0x01)==0    
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
249f0 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
24a00 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
24a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
24a30 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
24a40 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66   (bEnd || a==ovf
24a50 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20  lSize)          
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
24a80 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
24a90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
24aa0 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24ac0 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
24ad0 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
24ae0 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
24af0 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
24b00 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
24b10 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
24b20 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
24b30 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24b50 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
24b60 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
24b70 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a          /* (7) *
24ba0 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
24bb0 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
24bc0 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
24bd0 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
24be0 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
24bf0 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
24c00 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
24c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37       /* hence (7
24c30 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
24c40 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
24c50 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
24c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
24c70 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
24c80 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
24c90 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
24ca0 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
24cb0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
24cc0 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
24cd0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
24ce0 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
24cf0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
24d00 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
24d10 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
24d20 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
24d30 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24d40 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
24d50 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  e(pBt->pPager, n
24d60 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
24d70 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
24d80 20 28 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20   ((eOp&0x01)==0 
24d90 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  ? PAGER_GET_READ
24da0 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20  ONLY : 0).      
24db0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20      );.         
24dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24dd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
24de0 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
24df0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
24e00 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
24e10 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
24e20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
24e30 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
24e40 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
24e50 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
24e60 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
24e70 20 28 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62   (eOp&0x01), pDb
24e80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24e90 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
24ea0 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
24eb0 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65             offse
24ec0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
24ed0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24ee0 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20       amt -= a;. 
24ef0 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61         pBuf += a
24f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24f10 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
24f20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
24f30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
24f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24f50 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
24f60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
24f70 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
24f80 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
24f90 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
24fa0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
24fb0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
24fc0 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74   transferred int
24fd0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
24fe0 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
24ff0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
25000 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
25010 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61 74  must ensure that
25020 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e   pCur is pointin
25030 67 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  g to a valid row
25040 0a 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65  .** in the table
25050 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
25060 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
25070 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
25080 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
25090 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
250a0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
250b0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
250c0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
250d0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
250e0 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
250f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25100 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
25110 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
25120 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
25130 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
25140 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
25150 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
25160 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25170 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25190 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
251a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
251b0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
251c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
251d0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
251e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
251f0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
25200 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63   );.  return acc
25210 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
25220 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
25230 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
25240 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  uf, 0);.}../*.**
25250 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
25260 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  e data associate
25270 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
25280 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
25290 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
252a0 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
252b0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
252c0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
252d0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
252e0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
252f0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
25300 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
25310 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
25320 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
25330 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
25340 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
25350 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
25360 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
25370 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
25380 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
25390 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a  eData(BtCursor *
253a0 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
253b0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
253c0 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
253d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
253e0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
253f0 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74    if ( pCur->eSt
25400 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
25410 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
25420 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  n SQLITE_ABORT;.
25430 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73    }.#endif..  as
25440 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25450 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25460 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
25470 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
25480 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
25490 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
254a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
254b0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
254c0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
254d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
254e0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
254f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
25500 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
25510 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
25520 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
25530 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
25540 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
25550 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
25560 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
25570 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
25580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
25590 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
255a0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f  pointer to paylo
255b0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ad information f
255c0 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68  rom the entry th
255d0 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20  at the .** pCur 
255e0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
255f0 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e  ng to.  The poin
25600 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62 65  ter is to the be
25610 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68  ginning of.** th
25620 65 20 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62  e key if index b
25630 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
25640 74 4b 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20  tKey==0) and is 
25650 74 68 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20  the data for.** 
25660 74 61 62 6c 65 20 62 74 72 65 65 73 20 28 70 50  table btrees (pP
25670 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e  age->intKey==1).
25680 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   The number of b
25690 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c  ytes of availabl
256a0 65 0a 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73  e.** key/data is
256b0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70   written into *p
256c0 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d  Amt.  If *pAmt==
256d0 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  0, then the valu
256e0 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69  e.** returned wi
256f0 6c 6c 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69  ll not be a vali
25700 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  d pointer..**.**
25710 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
25720 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
25730 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20  .  It is common 
25740 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b  for the entire k
25750 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74  ey.** and data t
25760 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63  o fit on the loc
25770 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20  al page and for 
25780 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f  there to be no o
25790 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73  verflow.** pages
257a0 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69 73 20  .  When that is 
257b0 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  so, this routine
257c0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
257d0 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65  access the.** ke
257e0 79 20 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f  y and data witho
257f0 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79  ut making a copy
25800 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e  .  If the key an
25810 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73  d/or data spills
25820 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f  .** onto overflo
25830 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63  w pages, then ac
25840 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75  cessPayload() mu
25850 73 74 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  st be used to re
25860 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20  assemble.** the 
25870 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70  key/data and cop
25880 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61  y it into a prea
25890 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e  llocated buffer.
258a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
258b0 65 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  er returned by t
258c0 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
258d0 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20  s directly into 
258e0 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61  the cached.** pa
258f0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
25900 73 65 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69  se.  The data mi
25910 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f  ght change or mo
25920 76 65 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65  ve the next time
25930 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f  .** any btree ro
25940 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
25950 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
25960 20 76 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c   void *fetchPayl
25970 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
25980 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
25990 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
259a0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
259b0 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70  from */.  u32 *p
259c0 41 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  Amt            /
259d0 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
259e0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
259f0 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b  bytes here */.){
25a00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
25a10 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
25a20 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
25a30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25a40 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
25a50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25a60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
25a70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
25a80 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
25a90 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
25aa0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
25ab0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25ac0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25ad0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
25ae0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
25af0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
25b00 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
25b10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25b20 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a  info.nSize>0 );.
25b30 20 20 2a 70 41 6d 74 20 3d 20 70 43 75 72 2d 3e    *pAmt = pCur->
25b40 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 72  info.nLocal;.  r
25b50 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75  eturn (void*)pCu
25b60 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
25b70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20  ;.}.../*.** For 
25b80 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63  the entry that c
25b90 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f  ursor pCur is po
25ba0 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61  int to, return a
25bb0 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20  s.** many bytes 
25bc0 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61  of the key or da
25bd0 74 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61  ta as are availa
25be0 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ble on the local
25bf0 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e  .** b-tree page.
25c00 20 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62    Write the numb
25c10 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
25c20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74  bytes into *pAmt
25c30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e  ..**.** The poin
25c40 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ter returned is 
25c50 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20  ephemeral.  The 
25c60 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76  key/data may mov
25c70 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72  e.** or be destr
25c80 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  oyed on the next
25c90 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72   call to any Btr
25ca0 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69  ee routine,.** i
25cb0 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66  ncluding calls f
25cc0 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64  rom other thread
25cd0 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61  s against the sa
25ce0 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e  me cache..** Hen
25cf0 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74  ce, a mutex on t
25d00 68 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75  he BtShared shou
25d10 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72  ld be held prior
25d20 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74   to calling.** t
25d30 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a  his routine..**.
25d40 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  ** These routine
25d50 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74  s is used to get
25d60 20 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f   quick access to
25d70 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a   key and data.**
25d80 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
25d90 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65  ase where no ove
25da0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
25db0 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76  used..*/.const v
25dc0 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65  oid *sqlite3Btre
25dd0 65 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73  eKeyFetch(BtCurs
25de0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
25df0 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
25e00 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
25e10 2c 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74  , pAmt);.}.const
25e20 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
25e30 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
25e40 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
25e50 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
25e60 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
25e70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
25e80 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
25e90 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
25ea0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
25eb0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
25ec0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
25ed0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
25ee0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
25ef0 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
25f00 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
25f10 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
25f20 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
25f30 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
25f40 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
25f50 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
25f60 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
25f70 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
25f80 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
25f90 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
25fa0 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
25fb0 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
25fc0 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
25fd0 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
25fe0 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
25ff0 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
26000 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
26010 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
26020 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
26030 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
26040 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50    MemPage *pNewP
26050 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20  age;.  BtShared 
26060 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
26070 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
26080 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26090 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
260a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
260b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
260c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
260d0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
260e0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
260f0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
26100 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
26110 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
26120 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
26130 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
26140 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26150 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  PT;.  }.  rc = g
26160 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
26170 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65  t, newPgno, &pNe
26180 77 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  wPage,.         
26190 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72        (pCur->cur
261a0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
261b0 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47  teFlag)==0 ? PAG
261c0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
261d0 3a 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  : 0);.  if( rc )
261e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 43   return rc;.  pC
261f0 75 72 2d 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20  ur->apPage[i+1] 
26200 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70 43  = pNewPage;.  pC
26210 75 72 2d 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d  ur->aiIdx[i+1] =
26220 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
26230 65 2b 2b 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  e++;..  pCur->in
26240 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
26250 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
26260 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
26270 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
26280 6c 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61  l);.  if( pNewPa
26290 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 70  ge->nCell<1 || p
262a0 4e 65 77 50 61 67 65 2d 3e 69 6e 74 4b 65 79 21  NewPage->intKey!
262b0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  =pCur->apPage[i]
262c0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
262d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
262e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
262f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26300 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a  OK;.}..#if 0./*.
26310 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20  ** Page pParent 
26320 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28  is an internal (
26330 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70  non-leaf) tree p
26340 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  age. This functi
26350 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74  on .** asserts t
26360 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
26370 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65  iChild is the le
26380 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20  ft-child if the 
26390 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20  iIdx'th.** cell 
263a0 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e  in page pParent.
263b0 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20   Or, if iIdx is 
263c0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74  equal to the tot
263d0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  al number of.** 
263e0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
263f0 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  , that page numb
26400 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
26410 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a   right-child of.
26420 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  ** the page..*/.
26430 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
26440 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65  rtParentIndex(Me
26450 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
26460 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69  int iIdx, Pgno i
26470 43 68 69 6c 64 29 7b 0a 20 20 61 73 73 65 72 74  Child){.  assert
26480 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d  ( iIdx<=pParent-
26490 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20  >nCell );.  if( 
264a0 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx==pParent->n
264b0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65  Cell ){.    asse
264c0 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50  rt( get4byte(&pP
264d0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
264e0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
264f0 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  8])==iChild );. 
26500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
26510 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e  rt( get4byte(fin
26520 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69  dCell(pParent, i
26530 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b  Idx))==iChild );
26540 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20  .  }.}.#else.#  
26550 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72  define assertPar
26560 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20  entIndex(x,y,z) 
26570 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
26580 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75  ove the cursor u
26590 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  p to the parent 
265a0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  page..**.** pCur
265b0 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
265c0 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74  the cell index t
265d0 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
265e0 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
265f0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63  he page we are c
26600 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20  oming from.  If 
26610 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
26620 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  om the.** right-
26630 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20  most child page 
26640 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69  then pCur->idx i
26650 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72  s set to one mor
26660 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61  e than.** the la
26670 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78  rgest cell index
26680 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
26690 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74   moveToParent(Bt
266a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
266b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
266c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
266d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
266e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
266f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
26700 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
26710 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
26720 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26730 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 0a 20 20  r->iPage] );..  
26740 2f 2a 20 55 50 44 41 54 45 3a 20 49 74 20 69 73  /* UPDATE: It is
26750 20 61 63 74 75 61 6c 6c 79 20 70 6f 73 73 69 62   actually possib
26760 6c 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 64 69  le for the condi
26770 74 69 6f 6e 20 74 65 73 74 65 64 20 62 79 20 74  tion tested by t
26780 68 65 20 61 73 73 65 72 74 0a 20 20 2a 2a 20 62  he assert.  ** b
26790 65 6c 6f 77 20 74 6f 20 62 65 20 75 6e 74 72 75  elow to be untru
267a0 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
267b0 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
267c0 74 2e 20 54 68 69 73 20 63 61 6e 20 6f 63 63 75  t. This can occu
267d0 72 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 63 75  r if.  ** one cu
267e0 72 73 6f 72 20 68 61 73 20 6d 6f 64 69 66 69 65  rsor has modifie
267f0 64 20 70 61 67 65 20 70 50 61 72 65 6e 74 20 77  d page pParent w
26800 68 69 6c 65 20 61 20 72 65 66 65 72 65 6e 63 65  hile a reference
26810 20 74 6f 20 69 74 20 69 73 20 68 65 6c 64 20 0a   to it is held .
26820 20 20 2a 2a 20 62 79 20 61 20 73 65 63 6f 6e 64    ** by a second
26830 20 63 75 72 73 6f 72 2e 20 57 68 69 63 68 20 63   cursor. Which c
26840 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  an only happen i
26850 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
26860 69 73 20 6c 69 6e 6b 65 64 0a 20 20 2a 2a 20 69  is linked.  ** i
26870 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
26880 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
26890 72 65 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  re in a corrupt 
268a0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 23 69  database.  */.#i
268b0 66 20 30 0a 20 20 61 73 73 65 72 74 50 61 72 65  f 0.  assertPare
268c0 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
268d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
268e0 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
268f0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
26900 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
26910 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
26920 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a  r->iPage]->pgno.
26930 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 74 65    );.#endif.  te
26940 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
26950 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
26960 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
26970 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
26980 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 72 65  ->nCell );..  re
26990 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
269a0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
269b0 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
269c0 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
269d0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
269e0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
269f0 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
26a00 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
26a10 66 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  fl);.}../*.** Mo
26a20 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
26a30 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
26a40 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
26a50 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
26a60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
26a70 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
26a80 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
26a90 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
26aa0 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
26ab0 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
26ac0 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
26ad0 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
26ae0 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
26af0 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
26b00 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
26b10 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
26b20 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
26b30 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
26b40 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
26b50 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
26b60 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
26b70 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
26b80 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
26b90 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
26ba0 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
26bb0 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
26bc0 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
26bd0 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
26be0 4c 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  LID. Otherwise, 
26bf0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65  the cursor is se
26c00 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
26c10 65 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20  e first.** cell 
26c20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
26c30 6f 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20  oot (or virtual 
26c40 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74  root) page and t
26c50 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a  he cursor state.
26c60 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  ** is set to CUR
26c70 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
26c80 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
26c90 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
26ca0 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
26cb0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
26cc0 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
26cd0 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
26ce0 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
26cf0 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
26d00 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
26d10 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
26d20 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
26d30 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
26d40 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
26d50 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
26d60 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
26d70 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
26d80 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
26d90 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
26da0 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
26db0 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
26dc0 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
26dd0 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
26de0 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
26df0 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
26e00 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
26e10 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
26e20 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
26e30 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
26e40 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
26e50 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
26e60 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
26e70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
26e80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
26e90 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
26ea0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
26eb0 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
26ec0 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53  R_INVALID < CURS
26ed0 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
26ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
26ef0 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52  OR_VALID   < CUR
26f00 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
26f10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
26f20 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55  SOR_FAULT   > CU
26f30 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
26f40 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
26f50 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
26f60 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20  EQUIRESEEK ){.  
26f70 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
26f80 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
26f90 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
26fa0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
26fb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
26fc0 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
26fd0 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  ->skipNext;.    
26fe0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
26ff0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
27000 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ur);.  }..  if( 
27010 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
27020 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
27030 72 2d 3e 69 50 61 67 65 20 29 20 72 65 6c 65 61  r->iPage ) relea
27040 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
27050 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
27060 2d 5d 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  -]);.  }else if(
27070 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
27080 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
27090 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
270a0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
270b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
270c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
270d0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
270e0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42  pCur->pBtree->pB
270f0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
27100 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
27110 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [0],.           
27120 20 20 20 20 20 20 28 70 43 75 72 2d 3e 63 75 72        (pCur->cur
27130 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
27140 74 65 46 6c 61 67 29 3d 3d 30 20 3f 20 50 41 47  teFlag)==0 ? PAG
27150 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
27160 3a 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  : 0);.    if( rc
27170 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27180 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
27190 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
271a0 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
271b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
271c0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
271d0 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
271e0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
271f0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
27200 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  pgno==pCur->pgno
27210 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Root );..  /* If
27220 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20   pCur->pKeyInfo 
27230 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
27240 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  n the caller tha
27250 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75  t opened this cu
27260 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74  rsor.  ** expect
27270 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
27280 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
27290 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
272a0 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a  pKeyInfo is.  **
272b0 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65   NULL, the calle
272c0 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c  r expects a tabl
272d0 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69  e b-tree. If thi
272e0 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  s is not the cas
272f0 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61  e,.  ** return a
27300 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
27310 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20   error. .  **.  
27320 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  ** Earlier versi
27330 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73  ons of SQLite as
27340 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20  sumed that this 
27350 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66  test could not f
27360 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  ail.  ** if the 
27370 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c  root page was al
27380 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65  ready loaded whe
27390 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
273a0 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e  was called (i.e.
273b0 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69  .  ** if pCur->i
273c0 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68  Page>=0). But th
273d0 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20  is is not so if 
273e0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
273f0 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20  corrupted .  ** 
27400 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68  in such a way th
27410 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73  at page pRoot is
27420 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73   linked into a s
27430 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62  econd b-tree tab
27440 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65  le .  ** (or the
27450 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a   freelist).  */.
27460 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
27470 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52  >intKey==1 || pR
27480 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  oot->intKey==0 )
27490 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69  ;.  if( pRoot->i
274a0 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75  sInit==0 || (pCu
274b0 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21  r->pKeyInfo==0)!
274c0 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29  =pRoot->intKey )
274d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
274e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
274f0 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61  ;.  }..  pCur->a
27500 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70  iIdx[0] = 0;.  p
27510 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
27520 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
27530 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
27540 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
27550 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
27560 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52  Ovfl);..  if( pR
27570 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
27580 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
27590 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
275a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
275b0 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
275c0 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
275d0 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
275e0 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
275f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
27600 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
27610 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
27620 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
27630 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
27640 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
27650 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
27660 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
27670 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
27680 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
27690 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
276a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
276b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
276c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
276d0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
276e0 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
276f0 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
27700 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
27710 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
27720 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
27730 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
27740 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
27750 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
27760 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
27770 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
27780 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
27790 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
277a0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
277b0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
277c0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
277d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
277e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
277f0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
27800 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27810 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
27820 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
27830 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
27840 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
27850 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
27860 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
27870 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
27880 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
27890 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
278a0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
278b0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
278c0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
278d0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
278e0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
278f0 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
27900 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
27910 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
27920 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
27930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
27940 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
27950 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
27960 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
27970 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
27980 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
27990 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
279a0 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
279b0 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
279c0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
279d0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
279e0 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
279f0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
27a00 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
27a10 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
27a20 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
27a30 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
27a40 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
27a50 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
27a60 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
27a70 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
27a80 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
27a90 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
27aa0 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
27ab0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
27ac0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
27ad0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
27ae0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
27af0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
27b00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
27b10 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
27b20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
27b30 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
27b40 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
27b50 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
27b60 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
27b70 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27b80 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
27b90 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61  ;.  while( !(pPa
27ba0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
27bb0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
27bc0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
27bd0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
27be0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
27bf0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
27c00 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
27c10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
27c20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
27c30 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
27c40 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
27c50 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
27c60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
27c70 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27c80 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
27c90 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72  nCell-1;.  asser
27ca0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
27cb0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ize==0 );.  asse
27cc0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
27cd0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
27ce0 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65  NKey)==0 );.  re
27cf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27d00 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
27d10 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
27d20 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
27d30 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
27d40 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
27d50 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
27d60 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
27d70 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
27d80 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
27d90 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
27da0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
27db0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
27dc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
27dd0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
27de0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
27df0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
27e00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27e10 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27e20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
27e30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27e40 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
27e50 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
27e60 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
27e70 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
27e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27e90 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
27ea0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
27eb0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
27ec0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
27ed0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
27ee0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27ef0 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
27f00 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
27f10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27f20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
27f30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27f40 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
27f50 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
27f60 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
27f70 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
27f80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
27f90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
27fa0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
27fb0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
27fc0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
27fd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
27fe0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
27ff0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
28000 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
28010 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
28020 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
28030 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
28040 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
28050 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
28060 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43  te3BtreeLast(BtC
28070 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
28080 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
28090 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63  c;. .  assert( c
280a0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
280b0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
280c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
280d0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
280e0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
280f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
28100 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f  ursor already po
28110 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74  ints to the last
28120 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20   entry, this is 
28130 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66  a no-op. */.  if
28140 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
28150 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20  pCur->eState && 
28160 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
28170 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
28180 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
28190 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
281a0 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
281b0 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  s to assert() th
281c0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72 65  at the cursor re
281d0 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74 20  ally does point 
281e0 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c  .    ** to the l
281f0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
28200 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20   b-tree. */.    
28210 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 28  int ii;.    for(
28220 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69  ii=0; ii<pCur->i
28230 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Page; ii++){.   
28240 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28250 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72  >aiIdx[ii]==pCur
28260 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43  ->apPage[ii]->nC
28270 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ell );.    }.   
28280 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28290 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
282a0 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ]==pCur->apPage[
282b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
282c0 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73  ell-1 );.    ass
282d0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
282e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
282f0 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
28300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28310 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
28320 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
28330 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
28340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
28350 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
28360 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
28370 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
28380 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
28390 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
283a0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
283b0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
283c0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
283d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
283e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
283f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28400 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
28410 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
28420 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
28430 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66 28  pCur);.      if(
28440 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28450 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
28460 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
28470 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
28480 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
28490 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
284a0 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20  ~BTCF_AtLast;.  
284b0 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d 0a      }.   .    }.
284c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
284d0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
284e0 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69  cursor so that i
284f0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
28500 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65  ntry near the ke
28510 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  y .** specified 
28520 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e  by pIdxKey or in
28530 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61  tKey.   Return a
28540 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a   success code..*
28550 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20  *.** For INTKEY 
28560 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b  tables, the intK
28570 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ey parameter is 
28580 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a  used.  pIdxKey .
28590 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ** must be NULL.
285a0 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
285b0 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75  es, pIdxKey is u
285c0 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a  sed and intKey.*
285d0 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  * is ignored..**
285e0 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20  .** If an exact 
285f0 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75  match is not fou
28600 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  nd, then the cur
28610 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  sor is always.**
28620 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
28630 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68  t a leaf page wh
28640 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74  ich would hold t
28650 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a  he entry if it.*
28660 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20  * were present. 
28670 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68   The cursor migh
28680 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e  t point to an en
28690 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a  try that comes.*
286a0 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65  * before or afte
286b0 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  r the key..**.**
286c0 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77   An integer is w
286d0 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65  ritten into *pRe
286e0 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  s which is the r
286f0 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70  esult of.** comp
28700 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69  aring the key wi
28710 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  th the entry to 
28720 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72  which the cursor
28730 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67   is .** pointing
28740 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f  .  The meaning o
28750 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72  f the integer wr
28760 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70  itten into.** *p
28770 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  Res is as follow
28780 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  s:.**.**     *pR
28790 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75  es<0      The cu
287a0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
287b0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
287c0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
287d0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d             is sm
287e0 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65  aller than intKe
287f0 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20  y/pIdxKey or if 
28800 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
28810 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ty.**           
28820 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63         and the c
28830 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f  ursor is therefo
28840 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f  re left point to
28850 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
28860 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20      *pRes==0    
28870 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
28880 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
28890 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65    exactly matche
288c0 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  s intKey/pIdxKey
288d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
288e0 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s>0      The cur
288f0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
28900 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
28910 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
28920 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72            is lar
28930 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ger than intKey/
28940 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69  pIdxKey..**.*/.i
28950 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
28960 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20  ovetoUnpacked(. 
28970 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
28980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28990 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f   cursor to be mo
289a0 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ved */.  Unpacke
289b0 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79  dRecord *pIdxKey
289c0 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e  , /* Unpacked in
289d0 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34  dex key */.  i64
289e0 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20   intKey,        
289f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
28a00 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  le key */.  int 
28a10 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
28a20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
28a30 20 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68   bias the search
28a40 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
28a50 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28a70 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
28a80 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
28a90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65  {.  int rc;.  Re
28aa0 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63  cordCompare xRec
28ab0 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61  ordCompare;..  a
28ac0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
28ad0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
28ae0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
28af0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
28b00 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
28b10 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
28b20 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
28b30 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
28b40 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
28b50 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  nfo==0) );..  /*
28b60 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
28b70 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69  s already positi
28b80 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e  oned at the poin
28b90 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a  t we are trying.
28ba0 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c    ** to move to,
28bb0 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
28bc0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
28bd0 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66  any work */.  if
28be0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28bf0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20  CURSOR_VALID && 
28c00 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
28c10 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  & BTCF_ValidNKey
28c20 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d  )!=0.   && pCur-
28c30 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
28c40 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
28c50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
28c60 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
28c70 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
28c80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28c90 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
28ca0 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
28cb0 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
28cc0 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e  )!=0 && pCur->in
28cd0 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
28ce0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
28cf0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
28d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
28d10 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64  }.  }..  if( pId
28d20 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63  xKey ){.    xRec
28d30 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c  ordCompare = sql
28d40 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
28d50 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  are(pIdxKey);.  
28d60 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f    pIdxKey->errCo
28d70 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  de = 0;.    asse
28d80 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  rt( pIdxKey->def
28d90 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20  ault_rc==1 .    
28da0 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
28db0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a  >default_rc==0 .
28dc0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
28dd0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
28de0 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  =-1.    );.  }el
28df0 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43  se{.    xRecordC
28e00 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41  ompare = 0; /* A
28e10 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65  ll keys are inte
28e20 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72  gers */.  }..  r
28e30 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
28e40 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
28e50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
28e60 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
28e70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
28e80 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
28e90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
28ea0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28eb0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
28ec0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28ed0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
28ee0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
28ef0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28f00 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
28f10 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28f20 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
28f30 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
28f40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28f50 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
28f60 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
28f70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
28f80 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
28f90 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28fa0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
28fb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28fc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
28fd0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
28fe0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
28ff0 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
29000 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
29010 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
29020 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
29030 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
29040 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
29050 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29060 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
29070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
29090 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
290a0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
290b0 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
290c0 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
290d0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
290e0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
290f0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
29100 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
29110 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
29120 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
29130 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
29140 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
29150 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
29160 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
29170 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
29180 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
29190 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
291a0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
291b0 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
291c0 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
291d0 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
291e0 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
291f0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
29200 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
29210 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
29220 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
29230 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
29240 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
29250 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
29260 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
29270 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
29280 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
29290 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
292a0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
292b0 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
292c0 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
292d0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
292e0 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
292f0 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
29300 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
29310 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
29320 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
29330 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
29340 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
29350 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
29360 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
29370 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
29380 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
29390 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
293a0 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
293b0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
293c0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
293d0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 20 2b  ll(pPage, idx) +
293e0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
293f0 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
29400 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
29410 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
29420 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
29430 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
29440 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
29450 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
29460 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51  aEnd ) return SQ
29470 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29480 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
29490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
294a0 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
294b0 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
294c0 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
294d0 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
294e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
294f0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
29500 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
29510 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
29520 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
29530 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
29540 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
29550 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
29560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
29570 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
29580 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
29590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
295a0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
295b0 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
295c0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
295d0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
295e0 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20  ValidNKey;.     
295f0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
29600 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
29610 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
29620 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29630 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
29640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
29650 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
29660 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
29670 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
29680 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
29690 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
296a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
296b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
296c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
296d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
296e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
296f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
29700 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29710 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
29720 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
29730 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
29740 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
29750 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
29760 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
29770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29780 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
29790 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20   int nCell;.    
297a0 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
297b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
297c0 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
297d0 74 72 53 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20  trSize;..       
297e0 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
297f0 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
29800 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
29810 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
29820 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
29830 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
29840 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
29850 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
29860 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
29870 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
29880 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
29890 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
298a0 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
298b0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
298c0 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
298d0 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
298e0 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
298f0 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
29900 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
29910 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
29920 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
29930 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
29940 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
29950 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
29960 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
29970 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
29980 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
29990 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
299a0 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
299b0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
299c0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c      nCell = pCel
299d0 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
299e0 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
299f0 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
29a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
29a10 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
29a20 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
29a30 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
29a40 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
29a50 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
29a60 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
29a70 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
29a80 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
29a90 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
29aa0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
29ab0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
29ac0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
29ad0 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
29ae0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
29af0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
29b00 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
29b10 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
29b20 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
29b30 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
29b40 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
29b50 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
29b60 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
29b70 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
29b80 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
29b90 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
29ba0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
29bb0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
29bc0 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
29bd0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
29be0 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
29bf0 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
29c00 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
29c10 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
29c20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29c30 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
29c40 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
29c50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
29c60 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
29c70 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
29c80 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
29c90 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
29ca0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
29cb0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
29cc0 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
29cd0 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
29ce0 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
29cf0 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
29d00 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
29d10 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
29d20 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
29d30 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
29d40 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
29d50 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
29d60 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
29d70 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
29d80 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
29d90 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
29da0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
29db0 20 63 61 6c 6c 65 64 2e 20 2a 2f 0a 20 20 20 20   called. */.    
29dc0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
29dd0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
29de0 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c  u8 * const pCell
29df0 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70  Body = pCell - p
29e00 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
29e10 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 74  ze;.          bt
29e20 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
29e30 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79  pPage, pCellBody
29e40 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
29e50 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20            nCell 
29e60 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66  = (int)pCur->inf
29e70 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  o.nKey;.        
29e80 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c    pCellKey = sql
29e90 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c  ite3Malloc( nCel
29ea0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  l );.          i
29eb0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
29ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
29ed0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
29ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
29ef0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
29f00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
29f10 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
29f20 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29f30 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
29f40 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
29f50 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
29f60 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
29f70 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
29f80 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
29f90 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
29fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
29fb0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
29fc0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
29fd0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
29fe0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
29ff0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2a000 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2a010 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2a020 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2a030 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2a040 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2a050 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2a060 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2a070 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2a080 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2a090 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2a0a0 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2a0b0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2a0c0 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2a0d0 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2a0e0 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2a0f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2a100 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2a110 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2a120 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2a130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2a140 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2a150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a160 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2a170 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2a180 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2a190 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2a1a0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2a1b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a1c0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2a1d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a1e0 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2a1f0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2a200 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2a210 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2a220 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2a230 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2a240 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2a250 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2a260 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2a270 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2a280 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2a290 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2a2a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2a2b0 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2a2c0 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2a2d0 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2a2e0 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2a2f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2a300 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2a310 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2a320 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2a330 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2a340 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
2a350 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a360 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
2a370 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a380 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2a390 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
2a3a0 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
2a3b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2a3c0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2a3d0 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
2a3e0 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
2a3f0 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
2a400 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2a410 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2a420 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2a430 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2a440 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
2a450 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
2a460 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2a470 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
2a480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2a490 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a4a0 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
2a4b0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2a4c0 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
2a4d0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
2a4e0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
2a4f0 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
2a500 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2a510 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2a520 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2a530 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2a540 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75  lidOvfl);.  retu
2a550 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2a560 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2a570 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2a580 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a590 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
2a5a0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2a5b0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2a5c0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2a5d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2a5e0 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2a5f0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2a600 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2a610 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2a620 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2a630 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2a640 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2a650 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2a660 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2a670 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2a680 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2a690 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2a6a0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2a6b0 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2a6c0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2a6d0 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2a6e0 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2a6f0 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2a700 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2a710 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2a720 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2a730 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2a740 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2a750 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2a760 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2a770 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2a780 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2a790 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
2a7a0 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
2a7b0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2a7c0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2a7d0 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2a7e0 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2a7f0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2a800 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2a810 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
2a820 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2a830 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2a840 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2a850 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2a860 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2a870 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2a880 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2a890 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61  treeNext().  Tha
2a8a0 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2a8b0 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2a8c0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2a8d0 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e   merely incremen
2a8e0 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2a8f0 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2a900 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iIdx.** to the n
2a910 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ext cell on the 
2a920 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2a930 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2a940 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a  eNext() helper.*
2a950 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2a960 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2a970 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2a980 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2a990 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65  page or.** to re
2a9a0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2a9b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2a9c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2a9d0 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2a9e0 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2a9f0 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2aa00 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2aa10 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2aa20 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2aa30 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2aa40 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2aa50 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2aa60 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2aa70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2aa80 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2aa90 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2aaa0 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2aab0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2aac0 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2aad0 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2aae0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2aaf0 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2ab00 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2ab10 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2ab20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2ab30 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2ab40 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2ab50 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2ab60 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2ab70 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2ab80 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2ab90 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2aba0 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2abb0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2abc0 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2abd0 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2abe0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2abf0 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2ac00 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2ac10 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2ac20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2ac30 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2ac40 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2ac50 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2ac60 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2ac70 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2ac80 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2ac90 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2aca0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2acb0 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2acc0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2acd0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
2ace0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
2acf0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2ad00 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
2ad10 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72  =0 );.    rc = r
2ad20 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2ad30 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20  tion(pCur);.    
2ad40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ad50 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
2ad60 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2ad70 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
2ad80 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
2ad90 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2ada0 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
2adb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2adc0 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
2add0 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20  >skipNext ){.   
2ade0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2adf0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ae00 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
2ae10 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
2ae20 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20  IPNEXT );.      
2ae30 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2ae40 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
2ae50 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2ae60 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20  pNext>0 ){.     
2ae70 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2ae80 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2ae90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2aea0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2aeb0 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2aec0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
2aed0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2aee0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2aef0 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
2af00 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2af10 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
2af20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2af30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
2af40 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
2af50 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70  corrupt, it is p
2af60 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20  ossible for the 
2af70 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20  value of idx .  
2af80 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ** to be invalid
2af90 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20   here. This can 
2afa0 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20  only occur if a 
2afb0 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f  second cursor mo
2afc0 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20  difies.  ** the 
2afd0 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f  page while curso
2afe0 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e  r pCur is holdin
2aff0 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  g a reference to
2b000 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20   it. Which can. 
2b010 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20   ** only happen 
2b020 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
2b030 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75  is corrupt in su
2b040 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c  ch a way as to l
2b050 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67  ink the.  ** pag
2b060 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e  e into more than
2b070 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75   one b-tree stru
2b080 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74  cture. */.  test
2b090 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d  case( idx>pPage-
2b0a0 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28  >nCell );..  if(
2b0b0 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   idx>=pPage->nCe
2b0c0 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  ll ){.    if( !p
2b0d0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b0e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2b0f0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
2b100 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2b110 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2b120 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69  et+8]));.      i
2b130 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b140 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
2b150 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2b160 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2b170 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  do{.      if( pC
2b180 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2b190 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2b1a0 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  1;.        pCur-
2b1b0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2b1c0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
2b1d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b1e0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2b1f0 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2b200 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
2b210 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2b220 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2b230 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
2b240 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2b250 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ge]>=pPage->nCel
2b260 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  l );.    if( pPa
2b270 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
2b280 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
2b290 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72  e3BtreeNext(pCur
2b2a0 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2b2b0 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
2b2c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b2d0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
2b2e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
2b2f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b300 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2b310 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2b320 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  ost(pCur);.  }.}
2b330 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2b340 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a  eNext(BtCursor *
2b350 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2b360 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2b370 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75  ge;.  assert( cu
2b380 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2b390 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b3a0 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2b3b0 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2b3c0 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2b3d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2b3e0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2b3f0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2b400 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2b410 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2b420 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2b430 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2b440 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2b450 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65  lidOvfl);.  *pRe
2b460 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  s = 0;.  if( pCu
2b470 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2b480 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
2b490 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2b4a0 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20   pRes);.  pPage 
2b4b0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2b4c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2b4d0 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64  f( (++pCur->aiId
2b4e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e  x[pCur->iPage])>
2b4f0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2b500 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2b510 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2b520 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2b530 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2b540 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2b550 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2b560 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2b570 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2b580 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2b590 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2b5a0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2b5b0 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2b5c0 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2b5d0 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2b5e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2b5f0 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2b600 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2b610 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2b620 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2b630 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
2b640 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2b650 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2b660 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2b670 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2b680 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2b690 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2b6a0 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2b6b0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2b6c0 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  s().  That routi
2b6d0 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2b6e0 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2b6f0 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2b700 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   decrementing th
2b710 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2b720 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2b730 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2b740 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2b750 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2b760 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72  (slower) btreePr
2b770 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70  evious().** help
2b780 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  er routine is ca
2b790 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2b7a0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2b7b0 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2b7c0 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72   page.** or to r
2b7d0 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2b7e0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2b7f0 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2b800 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2b810 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2b820 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2b830 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2b840 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2b850 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2b860 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2b870 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2b880 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2b890 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2b8a0 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2b8b0 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2b8c0 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2b8d0 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2b8e0 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2b8f0 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2b900 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2b910 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2b920 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2b930 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2b940 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2b950 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2b960 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2b970 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2b980 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2b990 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2b9a0 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2b9b0 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2b9c0 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2b9d0 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2b9e0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2b9f0 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2ba00 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2ba10 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2ba20 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50  NLINE int btreeP
2ba30 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
2ba40 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2ba50 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2ba60 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2ba70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2ba80 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2ba90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2baa0 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2bab0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2bac0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bad0 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2bae0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2baf0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
2bb00 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2bb10 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41  rFlags & (BTCF_A
2bb20 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64  tLast|BTCF_Valid
2bb30 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Ovfl|BTCF_ValidN
2bb40 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73  Key))==0 );.  as
2bb50 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
2bb60 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69  .nSize==0 );.  i
2bb70 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2bb80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2bb90 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2bba0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2bbb0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2bbc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2bbd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2bbe0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2bbf0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2bc00 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2bc10 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2bc20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2bc30 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2bc40 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2bc50 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73  Next ){.      as
2bc60 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2bc70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2bc80 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
2bc90 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
2bca0 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  T );.      pCur-
2bcb0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2bcc0 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66  _VALID;.      if
2bcd0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2bce0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  <0 ){.        pC
2bcf0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2bd00 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2bd10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2bd20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
2bd30 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2bd40 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
2bd50 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2bd60 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2bd70 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2bd80 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
2bd90 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2bda0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
2bdb0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2bdc0 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20  Page];.    rc = 
2bdd0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2bde0 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
2bdf0 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
2be00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2be10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
2be20 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
2be30 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
2be40 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
2be50 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2be60 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
2be70 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2be80 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2be90 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2bea0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2beb0 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
2bec0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
2bed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2bee0 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65      }.      move
2bef0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
2bf00 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2bf10 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2bf20 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ze==0 );.    ass
2bf30 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2bf40 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c  lags & (BTCF_Val
2bf50 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2bf60 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
2bf70 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2bf80 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
2bf90 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2bfa0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2bfb0 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50  age];.    if( pP
2bfc0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2bfd0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2bfe0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2bff0 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70  3BtreePrevious(p
2c000 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
2c010 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2c020 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2c030 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2c040 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
2c050 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42  3BtreePrevious(B
2c060 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2c070 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73  nt *pRes){.  ass
2c080 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2c090 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2c0a0 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2c0b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2c0c0 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d  Res==0 || *pRes=
2c0d0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2c0e0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2c0f0 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2c100 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2c110 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2c120 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2c130 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2c140 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  t|BTCF_ValidOvfl
2c150 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29  |BTCF_ValidNKey)
2c160 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2c170 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Size = 0;.  if( 
2c180 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2c190 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c  RSOR_VALID.   ||
2c1a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2c1b0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20  r->iPage]==0.   
2c1c0 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2c1d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65  pCur->iPage]->le
2c1e0 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72  af==0.  ){.    r
2c1f0 65 74 75 72 6e 20 62 74 72 65 65 50 72 65 76 69  eturn btreePrevi
2c200 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
2c210 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
2c220 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  dx[pCur->iPage]-
2c230 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  -;.  return SQLI
2c240 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2c250 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70  Allocate a new p
2c260 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74  age from the dat
2c270 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
2c280 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69  * The new page i
2c290 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  s marked as dirt
2c2a0 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f  y.  (In other wo
2c2b0 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65  rds, sqlite3Page
2c2c0 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20  rWrite().** has 
2c2d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2c2e0 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70  led on the new p
2c2f0 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70  age.)  The new p
2c300 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20  age has also.** 
2c310 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20  been referenced 
2c320 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  and the calling 
2c330 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f  routine is respo
2c340 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69  nsible for calli
2c350 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  ng.** sqlite3Pag
2c360 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  erUnref() on the
2c370 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69   new page when i
2c380 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  t is done..**.**
2c390 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2c3a0 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
2c3b0 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65  s.  Any other re
2c3c0 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63  turn value indic
2c3d0 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  ates.** an error
2c3e0 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a  .  *ppPage and *
2c3f0 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69  pPgno are undefi
2c400 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74  ned in the event
2c410 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a   of an error..**
2c420 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73   Do not invoke s
2c430 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2c440 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66  () on *ppPage if
2c450 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
2c460 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
2c470 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72  the "nearby" par
2c480 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c  ameter is not 0,
2c490 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20   then an effort 
2c4a0 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c  is made to .** l
2c4b0 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f  ocate a page clo
2c4c0 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e  se to the page n
2c4d0 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20  umber "nearby". 
2c4e0 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
2c4f0 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d  d in an.** attem
2c500 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74  pt to keep relat
2c510 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74  ed pages close t
2c520 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20  o each other in 
2c530 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c540 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74  e,.** which in t
2c550 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74  urn can make dat
2c560 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61 73  abase access fas
2c570 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ter..**.** If th
2c580 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65  e eMode paramete
2c590 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41  r is BTALLOC_EXA
2c5a0 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62  CT and the nearb
2c5b0 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a  y page exists.**
2c5c0 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65   anywhere on the
2c5d0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
2c5e0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
2c5f0 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  d to be returned
2c600 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69  .  If.** eMode i
2c610 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65  s BTALLOC_LT the
2c620 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75 72  n the page retur
2c630 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73  ned will be less
2c640 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a   than or equal.*
2c650 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61  * to nearby if a
2c660 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78 69  ny such page exi
2c670 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69  sts.  If eMode i
2c680 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68  s BTALLOC_ANY th
2c690 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  en there.** are 
2c6a0 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20  no restrictions 
2c6b0 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69 73  on which page is
2c6c0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2c6d0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
2c6e0 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74  eBtreePage(.  Bt
2c6f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
2c700 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
2c710 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2c720 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a  *ppPage,      /*
2c730 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74   Store pointer t
2c740 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  o the allocated 
2c750 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50  page here */.  P
2c760 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20  gno *pPgno,     
2c770 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74        /* Store t
2c780 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  he page number h
2c790 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  ere */.  Pgno ne
2c7a0 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20 20  arby,           
2c7b0 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
2c7c0 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f  page near this o
2c7d0 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65  ne */.  u8 eMode
2c7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c7f0 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c  * BTALLOC_EXACT,
2c800 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20   BTALLOC_LT, or 
2c810 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29  BTALLOC_ANY */.)
2c820 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
2c830 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge1;.  int rc;. 
2c840 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e   u32 n;     /* N
2c850 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
2c860 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  n the freelist *
2c870 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f  /.  u32 k;     /
2c880 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76  * Number of leav
2c890 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  es on the trunk 
2c8a0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2c8b0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  */.  MemPage *pT
2c8c0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  runk = 0;.  MemP
2c8d0 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20  age *pPrevTrunk 
2c8e0 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61  = 0;.  Pgno mxPa
2c8f0 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ge;     /* Total
2c900 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
2c910 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2c920 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2c930 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2c940 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2c950 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  ert( eMode==BTAL
2c960 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72  LOC_ANY || (near
2c970 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69  by>0 && IfNotOmi
2c980 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  tAV(pBt->autoVac
2c990 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65  uum)) );.  pPage
2c9a0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
2c9b0 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65  .  mxPage = btre
2c9c0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
2c9d0 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
2c9e0 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37  F: R-05119-02637
2c9f0 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d   The 4-byte big-
2ca00 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61  endian integer a
2ca10 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a  t offset 36.  **
2ca20 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74   stores stores t
2ca30 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
2ca40 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2ca50 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e  freelist. */.  n
2ca60 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2ca70 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
2ca80 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d  .  testcase( n==
2ca90 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66  mxPage-1 );.  if
2caa0 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20  ( n>=mxPage ){. 
2cab0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cac0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2cad0 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
2cae0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
2caf0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2cb00 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f  eelist.  Reuse o
2cb10 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
2cb20 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  s. */.    Pgno i
2cb30 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65  Trunk;.    u8 se
2cb40 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a  archList = 0; /*
2cb50 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   If the free-lis
2cb60 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68  t must be search
2cb70 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20  ed for 'nearby' 
2cb80 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
2cb90 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
2cba0 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
2cbb0 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
2cbc0 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
2cbd0 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
2cbe0 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
2cbf0 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
2cc00 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
2cc10 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
2cc20 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
2cc30 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
2cc40 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
2cc50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2cc60 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
2cc70 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2cc80 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
2cc90 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
2cca0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  age ){.        u
2ccb0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
2ccc0 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
2ccd0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
2cce0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
2ccf0 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
2cd00 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
2cd10 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
2cd20 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
2cd30 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2cd40 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
2cd50 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
2cd60 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
2cd70 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2cd80 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2cd90 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2cda0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
2cdb0 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
2cdc0 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
2cdd0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
2cde0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
2cdf0 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
2ce00 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
2ce10 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
2ce20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
2ce30 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
2ce40 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
2ce50 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
2ce60 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
2ce70 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ce80 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
2ce90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2cea0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2ceb0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2cec0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2ced0 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
2cee0 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
2cef0 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
2cf00 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
2cf10 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
2cf20 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
2cf30 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
2cf40 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
2cf50 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
2cf60 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
2cf70 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
2cf80 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
2cf90 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
2cfa0 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
2cfb0 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
2cfc0 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
2cfd0 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
2cfe0 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
2cff0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2d000 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
2d010 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
2d020 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
2d030 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
2d040 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
2d050 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2d060 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20  01506-11053 The 
2d070 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e  first integer on
2d080 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
2d090 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  k page.        *
2d0a0 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  * is the page nu
2d0b0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
2d0c0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2d0d0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
2d0e0 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a   or.        ** z
2d0f0 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74  ero if this is t
2d100 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74  he last freelist
2d110 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a   trunk page. */.
2d120 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
2d130 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
2d140 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
2d150 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2d160 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
2d170 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31  CE-OF: R-59841-1
2d180 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20  3798 The 4-byte 
2d190 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
2d1a0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a  er at offset 32.
2d1b0 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2d1c0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
2d1d0 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
2d1e0 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c  age of the freel
2d1f0 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a  ist, or zero if.
2d200 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
2d210 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
2d220 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
2d230 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
2d240 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2d250 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2d260 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
2d270 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2d280 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
2d290 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
2d2a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2d2b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2d2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d2d0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2d2e0 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2d2f0 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2d300 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2d310 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2d320 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2d330 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2d340 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2d350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2d360 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2d370 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2d380 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
2d390 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2d3a0 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
2d3b0 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
2d3c0 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2d3d0 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2d3e0 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
2d3f0 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
2d400 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
2d410 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
2d420 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2d430 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2d440 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2d450 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2d460 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2d470 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2d480 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2d490 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2d4a0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2d4b0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2d4c0 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2d4d0 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2d4e0 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2d4f0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2d500 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2d510 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2d520 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2d530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2d540 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2d550 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2d560 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2d570 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2d580 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2d590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d5a0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2d5b0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2d5c0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2d5d0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2d5e0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2d5f0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2d600 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2d610 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2d620 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2d630 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2d640 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2d650 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2d660 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2d670 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2d680 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2d690 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2d6a0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2d6b0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2d6c0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2d6d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2d6e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2d6f0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2d700 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2d710 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2d720 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2d730 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2d740 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2d750 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2d760 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2d770 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2d780 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2d790 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2d7a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2d7b0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2d7c0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2d7d0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2d7e0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2d7f0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2d800 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2d810 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2d820 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2d830 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2d840 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2d850 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2d860 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2d870 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2d880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d890 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2d8a0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2d8b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2d8c0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2d8d0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2d8e0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2d8f0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2d900 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2d910 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2d920 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2d930 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2d940 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2d950 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2d960 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2d980 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d990 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2d9a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2d9b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2d9c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2d9d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2d9e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2d9f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2da00 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2da10 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2da20 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2da30 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2da40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2da60 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2da70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2da80 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2da90 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2daa0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2dab0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2dac0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2dad0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2dae0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2daf0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2db00 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2db10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2db20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2db30 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2db40 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2db50 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2db60 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2db70 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2db80 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2db90 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2dba0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2dbb0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2dbc0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2dbd0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2dbe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2dbf0 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2dc00 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2dc10 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2dc20 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2dc30 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
2dc40 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
2dc50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2dc60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2dc70 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2dc80 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2dc90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2dca0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2dcb0 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
2dcc0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2dcd0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2dce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dcf0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
2dd00 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
2dd10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2dd20 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2dd30 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2dd40 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
2dd50 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2dd60 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
2dd70 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
2dd80 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2dd90 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
2dda0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
2ddb0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
2ddc0 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
2ddd0 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
2dde0 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
2ddf0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
2de00 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
2de10 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
2de20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2de30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
2de40 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2de50 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2de60 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
2de70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
2de80 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
2de90 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
2dea0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
2deb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dec0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ded0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
2dee0 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
2def0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2df00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2df10 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2df20 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2df30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2df40 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
2df50 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
2df60 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
2df70 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
2df80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2df90 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2dfa0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
2dfb0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
2dfc0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
2dfd0 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
2dfe0 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
2dff0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e000 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
2e010 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
2e020 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
2e030 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
2e040 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
2e050 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
2e060 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
2e070 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
2e080 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
2e090 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
2e0a0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
2e0b0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
2e0c0 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
2e0d0 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
2e0e0 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
2e0f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
2e100 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
2e110 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
2e120 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
2e130 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
2e140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
2e150 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
2e160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2e170 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
2e180 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2e190 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2e1a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
2e1b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2e1c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
2e1d0 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
2e1e0 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
2e1f0 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
2e200 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
2e210 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
2e220 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
2e230 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
2e240 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
2e250 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
2e260 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
2e270 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
2e280 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2e290 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
2e2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e2b0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
2e2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
2e2d0 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
2e2e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e2f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e300 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2e310 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
2e320 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
2e330 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
2e340 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
2e350 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
2e360 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
2e370 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
2e380 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
2e390 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
2e3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
2e3b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e3c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2e3d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2e3e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2e3f0 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
2e400 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67  se( iPage==mxPag
2e410 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2e420 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20   !searchList .  
2e430 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67 65         || (iPage
2e440 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50 61  ==nearby || (iPa
2e450 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  ge<nearby && eMo
2e460 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2e470 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20   .        ){.   
2e480 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
2e490 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
2e4a0 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a  *pPgno = iPage;.
2e4b0 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28            TRACE(
2e4c0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77  ("ALLOCATE: %d w
2e4d0 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64  as leaf %d of %d
2e4e0 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20   on trunk %d".  
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e500 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70  : %d more free p
2e510 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ages\n",.       
2e520 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
2e530 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20  , closest+1, k, 
2e540 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d  pTrunk->pgno, n-
2e550 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  1));.          r
2e560 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2e570 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2e580 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2e590 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2e5a0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2e5b0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
2e5c0 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a   closest<k-1 ){.
2e5d0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2e5e0 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  py(&aData[8+clos
2e5f0 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34  est*4], &aData[4
2e600 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20  +k*4], 4);.     
2e610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e620 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61   put4byte(&aData
2e630 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
2e640 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d       noContent =
2e650 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e   !btreeGetHasCon
2e660 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f  tent(pBt, *pPgno
2e670 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  )? PAGER_GET_NOC
2e680 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20  ONTENT : 0;.    
2e690 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
2e6a0 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
2e6b0 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
2e6c0 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
2e6d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2e6e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2e6f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e700 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2e710 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2e720 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2e750 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2e760 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
2e770 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2e780 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
2e790 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
2e7a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2e7b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2e7c0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
2e7d0 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2e7e0 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
2e7f0 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
2e800 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
2e810 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
2e820 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
2e830 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61   append a new pa
2e840 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  ge to the.    **
2e850 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e   database image.
2e860 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
2e870 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67  ormally, new pag
2e880 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  es allocated by 
2e890 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62  this block can b
2e8a0 65 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  e requested from
2e8b0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   the.    ** page
2e8c0 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
2e8d0 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
2e8e0 61 67 20 73 65 74 2e 20 54 68 69 73 20 70 72 65  ag set. This pre
2e8f0 76 65 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a  vents the pager.
2e900 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
2e910 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ng to read the p
2e920 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ages content fro
2e930 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c  m disk. However,
2e940 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63   if the.    ** c
2e950 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
2e960 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 72  on has already r
2e970 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69  un one or more i
2e980 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2e990 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20  m.    ** steps, 
2e9a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 77 65  then the page we
2e9b0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c   are about to al
2e9c0 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61  locate may conta
2e9d0 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  in content.    *
2e9e0 2a 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  * that is requir
2e9f0 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
2ea00 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49  of a rollback. I
2ea10 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a  n this case, do.
2ea20 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74      ** not set t
2ea30 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c  he no-content fl
2ea40 61 67 2e 20 54 68 69 73 20 63 61 75 73 65 73 20  ag. This causes 
2ea50 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61  the pager to loa
2ea60 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20  d and journal.  
2ea70 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74    ** the current
2ea80 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65   page content be
2ea90 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67  fore overwriting
2eaa0 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   it..    **.    
2eab0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2eac0 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20   pager will not 
2ead0 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74  actually attempt
2eae0 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72   to load or jour
2eaf0 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  nal .    ** cont
2eb00 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65  ent for any page
2eb10 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65   that really doe
2eb20 73 20 6c 69 65 20 70 61 73 74 20 74 68 65 20 65  s lie past the e
2eb30 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
2eb40 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f  se.    ** file o
2eb50 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65  n disk. So the e
2eb60 66 66 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c  ffects of disabl
2eb70 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65  ing the no-conte
2eb80 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  nt optimization.
2eb90 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20      ** here are 
2eba0 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73  confined to thos
2ebb0 65 20 70 61 67 65 73 20 74 68 61 74 20 6c 69 65  e pages that lie
2ebc0 20 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64   between the end
2ebd0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   of the.    ** d
2ebe0 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e  atabase image an
2ebf0 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  d the end of the
2ec00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2ec10 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62      */.    int b
2ec20 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d  NoContent = (0==
2ec30 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
2ec40 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20  >bDoTruncate))? 
2ec50 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
2ec60 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d  ENT:0;..    rc =
2ec70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2ec80 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
2ec90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2eca0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ecb0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
2ecc0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  ++;.    if( pBt-
2ecd0 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
2ece0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
2ecf0 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a   pBt->nPage++;..
2ed00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2ed10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2ed20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
2ed30 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
2ed40 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74  _ISPAGE(pBt, pBt
2ed50 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20  ->nPage) ){.    
2ed60 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72    /* If *pPgno r
2ed70 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74  efers to a point
2ed80 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c  er-map page, all
2ed90 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61  ocate two new pa
2eda0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  ges.      ** at 
2edb0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
2edc0 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ile instead of o
2edd0 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c  ne. The first al
2ede0 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20 20  located page.   
2edf0 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20     ** becomes a 
2ee00 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  new pointer-map 
2ee10 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  page, the second
2ee20 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20   is used by the 
2ee30 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f  caller..      */
2ee40 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
2ee50 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  pPg = 0;.      T
2ee60 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2ee70 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2ee80 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61  file (pointer-ma
2ee90 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d  p page)\n", pBt-
2eea0 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20  >nPage));.      
2eeb0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
2eec0 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge!=PENDING_BYTE
2eed0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
2eee0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2eef0 74 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e  tPage(pBt, pBt->
2ef00 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f  nPage, &pPg, bNo
2ef10 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
2ef20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ef30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2ef40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2ef50 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65  ite(pPg->pDbPage
2ef60 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
2ef70 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  sePage(pPg);.   
2ef80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
2ef90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2efa0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b       pBt->nPage+
2efb0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  +;.      if( pBt
2efc0 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47  ->nPage==PENDING
2efd0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
2efe0 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b  ){ pBt->nPage++;
2eff0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2f000 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20      put4byte(28 
2f010 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67  + (u8*)pBt->pPag
2f020 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e  e1->aData, pBt->
2f030 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67  nPage);.    *pPg
2f040 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b  no = pBt->nPage;
2f050 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
2f060 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
2f070 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
2f080 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2f090 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
2f0a0 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
2f0b0 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
2f0c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f0d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f0e0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
2f0f0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
2f100 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2f120 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
2f130 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
2f140 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
2f150 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
2f160 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
2f170 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
2f180 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
2f190 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2f1a0 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
2f1b0 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
2f1c0 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
2f1d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
2f1e0 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
2f1f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2f200 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2f210 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
2f220 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
2f230 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
2f240 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
2f250 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70  Page);.      *pp
2f260 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
2f270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2f280 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2f290 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d  }.    (*ppPage)-
2f2a0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
2f2b0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67  else{.    *ppPag
2f2c0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
2f2d0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
2f2e0 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
2f2f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 28 2a  erIswriteable((*
2f300 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
2f310 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
2f320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2f330 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
2f340 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
2f350 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
2f360 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
2f370 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
2f380 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
2f390 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
2f3a0 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
2f3b0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
2f3c0 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
2f3d0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2f3e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
2f3f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
2f400 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
2f410 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
2f420 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
2f430 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
2f440 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
2f450 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
2f460 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
2f470 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
2f480 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
2f490 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
2f4a0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
2f4b0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
2f4c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
2f4d0 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
2f4e0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2f4f0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
2f500 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
2f510 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
2f520 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
2f530 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
2f540 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
2f550 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
2f560 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
2f570 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
2f580 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
2f590 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2f5a0 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
2f5b0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
2f5c0 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
2f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5e0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
2f5f0 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
2f600 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
2f610 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
2f620 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
2f630 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
2f640 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
2f650 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2f660 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2f670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2f680 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
2f690 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
2f6a0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6c0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
2f6d0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
2f6e0 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
2f6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f700 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
2f710 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
2f720 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
2f730 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2f740 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2f750 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
2f760 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
2f770 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
2f780 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
2f790 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
2f7a0 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
2f7b0 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
2f7c0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
2f7d0 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
2f7e0 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
2f7f0 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
2f800 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
2f810 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
2f820 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2f830 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
2f840 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
2f850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f860 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
2f870 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
2f880 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
2f890 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
2f8a0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2f8b0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
2f8c0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2f8d0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2f8e0 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20  Free+1);..  if( 
2f8f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2f900 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
2f910 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  E ){.    /* If t
2f920 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
2f930 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
2f940 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20  ed, then.    ** 
2f950 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65  always fully ove
2f960 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
2f970 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
2f980 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  zeros..    */.  
2f990 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26    if( (!pPage &&
2f9a0 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65 74   ((rc = btreeGet
2f9b0 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
2f9c0 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 29   &pPage, 0))!=0)
2f9d0 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20 20   ).     ||      
2f9e0 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71 6c        ((rc = sql
2f9f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2fa00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2fa10 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
2fa20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
2fa30 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  ut;.    }.    me
2fa40 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74  mset(pPage->aDat
2fa50 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74  a, 0, pPage->pBt
2fa60 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d  ->pageSize);.  }
2fa70 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2fa80 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
2fa90 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
2faa0 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
2fab0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2fac0 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
2fad0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
2fae0 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
2faf0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2fb00 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  {.    ptrmapPut(
2fb10 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
2fb20 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c 20  AP_FREEPAGE, 0, 
2fb30 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &rc);.    if( rc
2fb40 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65   ) goto freepage
2fb50 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
2fb60 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74  Now manipulate t
2fb70 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61  he actual databa
2fb80 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72  se free-list str
2fb90 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72  ucture. There ar
2fba0 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69  e two.  ** possi
2fbb0 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65  bilities. If the
2fbc0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75   free-list is cu
2fbd0 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f  rrently empty, o
2fbe0 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20  r if the first. 
2fbf0 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69   ** trunk page i
2fc00 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
2fc10 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68  is full, then th
2fc20 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
2fc30 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66  ome a.  ** new f
2fc40 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
2fc50 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
2fc60 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  it will become a
2fc70 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a   leaf of the.  *
2fc80 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  * first trunk pa
2fc90 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ge in the curren
2fca0 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69  t free-list. Thi
2fcb0 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66  s block tests if
2fcc0 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73   it.  ** is poss
2fcd0 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20  ible to add the 
2fce0 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72  page as a new fr
2fcf0 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20  ee-list leaf..  
2fd00 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d  */.  if( nFree!=
2fd10 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65  0 ){.    u32 nLe
2fd20 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  af;             
2fd30 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75     /* Initial nu
2fd40 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c  mber of leaf cel
2fd50 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  ls on trunk page
2fd60 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20   */..    iTrunk 
2fd70 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2fd80 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
2fd90 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
2fda0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
2fdb0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
2fdc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2fdd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
2fde0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
2fdf0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
2fe00 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
2fe10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
2fe20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
2fe30 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33 32  t->usableSize>32
2fe40 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61   );.    if( nLea
2fe50 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f > (u32)pBt->us
2fe60 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29  ableSize/4 - 2 )
2fe70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2fe80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2fe90 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
2fea0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
2feb0 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3c  .    if( nLeaf <
2fec0 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
2fed0 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
2fee0 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
2fef0 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
2ff00 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
2ff10 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
2ff20 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
2ff30 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
2ff40 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
2ff50 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
2ff60 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
2ff70 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
2ff80 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
2ff90 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
2ffa0 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
2ffb0 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
2ffc0 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
2ffd0 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
2ffe0 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
2fff0 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
30000 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
30010 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
30020 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
30030 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
30040 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
30050 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
30060 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
30070 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
30080 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
30090 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
300a0 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
300b0 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
300c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
300d0 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
300e0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
300f0 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
30100 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
30110 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
30120 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69 63  tinue to restric
30130 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
30140 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c  entries to usabl
30150 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20  eSize/4 - 8.    
30160 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41    ** for now.  A
30170 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
30180 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65  the future (once
30190 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70   everyone has up
301a0 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20  graded.      ** 
301b0 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65  to 3.6.0 or late
301c0 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e  r) we should con
301d0 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65  sider fixing the
301e0 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f   conditional abo
301f0 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72  ve.      ** to r
30200 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f  ead "usableSize/
30210 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  4-2" instead of 
30220 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22  "usableSize/4-8"
30230 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
30240 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
30250 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20 48   R-19920-11576 H
30260 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76 65  owever, newer ve
30270 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
30280 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20   still.      ** 
30290 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65 20  avoid using the 
302a0 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65 73  last six entries
302b0 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   in the freelist
302c0 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72 61   trunk page arra
302d0 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72  y in.      ** or
302e0 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61 73  der that databas
302f0 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64 20  e files created 
30300 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  by newer version
30310 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20  s of SQLite can 
30320 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64  be.      ** read
30330 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   by older versio
30340 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20  ns of SQLite..  
30350 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
30360 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30370 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
30380 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
30390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
303a0 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
303b0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
303c0 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20  [4], nLeaf+1);. 
303d0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
303e0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
303f0 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65  +nLeaf*4], iPage
30400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
30410 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62 74  Page && (pBt->bt
30420 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43  sFlags & BTS_SEC
30430 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  URE_DELETE)==0 )
30440 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
30450 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
30460 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
30470 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30480 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53       rc = btreeS
30490 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
304a0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
304b0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
304c0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
304d0 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
304e0 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
304f0 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
30500 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  );.      goto fr
30510 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
30520 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63  }.  }..  /* If c
30530 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20  ontrol flows to 
30540 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
30550 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73   it was not poss
30560 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a  ible to add the.
30570 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65    ** the page be
30580 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c  ing freed as a l
30590 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20  eaf page of the 
305a0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
305b0 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
305c0 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61  ** Possibly beca
305d0 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73  use the free-lis
305e0 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70  t is empty, or p
305f0 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
30600 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20  the .  ** first 
30610 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
30620 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20  e-list is full. 
30630 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
30640 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  page being freed
30650 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d  .  ** will becom
30660 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20  e the new first 
30670 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
30680 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
30690 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d 30  /.  if( pPage==0
306a0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
306b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
306c0 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
306d0 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20 20  Page, 0)) ){.   
306e0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
306f0 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ut;.  }.  rc = s
30700 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30710 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
30720 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
30730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
30740 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
30750 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
30760 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
30770 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
30780 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
30790 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
307a0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
307b0 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
307c0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
307d0 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
307e0 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
307f0 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
30800 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
30810 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
30820 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
30830 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
30840 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
30850 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
30860 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
30870 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
30880 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
30890 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  eePage(MemPage *
308a0 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43 29  pPage, int *pRC)
308b0 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
308c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
308d0 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67 65   *pRC = freePage
308e0 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50  2(pPage->pBt, pP
308f0 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  age, pPage->pgno
30900 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
30910 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
30920 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
30930 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
30940 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74 65 20 74  n Cell.  Write t
30950 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c  he.** local Cell
30960 20 73 69 7a 65 20 28 74 68 65 20 6e 75 6d 62 65   size (the numbe
30970 72 20 6f 66 20 62 79 74 65 73 20 6f 6e 20 74 68  r of bytes on th
30980 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 2c  e original page,
30990 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20 6f 76 65   omitting.** ove
309a0 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a 70 6e 53  rflow) into *pnS
309b0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
309c0 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20  nt clearCell(.  
309d0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
309e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
309f0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
30a00 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  ns the Cell */. 
30a10 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
30a20 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72  pCell,    /* Fir
30a30 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43  st byte of the C
30a40 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20 2a 70 6e  ell */.  u16 *pn
30a50 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
30a60 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 73    /* Write the s
30a70 69 7a 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  ize of the Cell 
30a80 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  here */.){.  BtS
30a90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
30aa0 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
30ab0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
30ac0 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
30ad0 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
30ae0 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65  ;.  u32 ovflPage
30af0 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
30b00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
30b10 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
30b20 6d 75 74 65 78 29 20 29 3b 0a 20 20 62 74 72 65  mutex) );.  btre
30b30 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
30b40 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
30b50 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20  o);.  *pnSize = 
30b60 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 69 66  info.nSize;.  if
30b70 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
30b80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
30b90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
30ba0 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
30bb0 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
30bc0 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
30bd0 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
30be0 43 65 6c 6c 2b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell+info.iOverf
30bf0 6c 6f 77 2b 33 20 3e 20 70 50 61 67 65 2d 3e 61  low+3 > pPage->a
30c00 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
30c10 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
30c20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
30c30 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
30c40 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
30c50 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
30c60 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
30c70 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
30c80 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
30c90 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
30ca0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
30cb0 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
30cc0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
30cd0 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
30ce0 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
30cf0 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
30d00 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
30d10 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
30d20 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
30d30 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
30d40 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
30d50 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
30d60 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
30d70 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
30d80 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
30d90 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
30da0 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no>btreePagecoun
30db0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
30dc0 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
30dd0 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
30de0 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
30df0 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
30e00 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
30e10 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
30e20 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
30e30 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
30e40 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
30e50 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
30e60 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
30e70 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30e80 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30e90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30ea0 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
30eb0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
30ec0 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
30ed0 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
30ee0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
30ef0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30f00 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70    }..    if( ( p
30f10 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20  Ovfl || ((pOvfl 
30f20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75  = btreePageLooku
30f30 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29  p(pBt, ovflPgno)
30f40 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20  )!=0) ).     && 
30f50 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
30f60 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e  Refcount(pOvfl->
30f70 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20  pDbPage)!=1.    
30f80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72  ){.      /* Ther
30f90 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61  e is no reason a
30fa0 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64  ny cursor should
30fb0 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e   have an outstan
30fc0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a  ding reference .
30fd0 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f        ** to an o
30fe0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c  verflow page bel
30ff0 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c  onging to a cell
31000 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64   that is being d
31010 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a  eleted/updated..
31020 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74        ** So if t
31030 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65  here exists more
31040 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65   than one refere
31050 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  nce to this page
31060 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20  , then it .     
31070 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61   ** must not rea
31080 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  lly be an overfl
31090 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20  ow page and the 
310a0 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
310b0 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20   corrupt. .     
310c0 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75   ** It is helpfu
310d0 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73  l to detect this
310e0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
310f0 66 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20  freePage2(), as 
31100 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61  .      ** freePa
31110 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74  ge2() may zero t
31120 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  he page contents
31130 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74   if secure-delet
31140 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20  e mode is.      
31150 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74  ** enabled. If t
31160 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70  his 'overflow' p
31170 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  age happens to b
31180 65 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68  e a page that th
31190 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65  e.      ** calle
311a0 72 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74  r is iterating t
311b0 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20  hrough or using 
311c0 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61  in some other wa
311d0 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a  y, this.      **
311e0 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61   can be problema
311f0 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tic..      */.  
31200 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
31210 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
31230 63 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42  c = freePage2(pB
31240 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67  t, pOvfl, ovflPg
31250 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  no);.    }..    
31260 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
31270 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
31280 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
31290 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
312a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
312b0 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
312c0 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
312d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
312e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
312f0 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
31300 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
31310 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
31320 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
31330 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
31340 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
31350 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
31360 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
31370 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
31380 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
31390 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
313a0 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
313b0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
313c0 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
313d0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
313e0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
313f0 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
31400 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
31410 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
31420 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
31430 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
31440 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
31450 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
31460 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
31470 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
31480 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
31490 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
314a0 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
314b0 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
314c0 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
314d0 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
314e0 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
314f0 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
31500 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
31510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31520 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
31530 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
31540 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
31550 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
31560 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
31570 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
31580 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
31590 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
315a0 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
315b0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
315c0 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
315d0 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
315e0 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  ta */.  int nZer
315f0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
31600 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
31610 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70  zero bytes to ap
31620 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f  pend to pData */
31630 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31650 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
31660 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
31670 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
31680 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
31690 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
316a0 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
316b0 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
316c0 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
316d0 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
316e0 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
316f0 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
31700 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
31710 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
31720 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
31730 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
31740 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
31750 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20  int nHeader;..  
31760 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
31770 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
31780 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
31790 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20  ..  /* pPage is 
317a0 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20  not necessarily 
317b0 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20  writeable since 
317c0 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61  pCell might be a
317d0 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75  uxiliary.  ** bu
317e0 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20  ffer space that 
317f0 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d  is separate from
31800 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65   the pPage buffe
31810 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65  r area */.  asse
31820 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d  rt( pCell<pPage-
31830 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e  >aData || pCell>
31840 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
31850 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
31860 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
31870 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
31880 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
31890 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  age) );..  /* Fi
318a0 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
318b0 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
318c0 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
318d0 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
318e0 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
318f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
31900 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
31910 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
31920 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
31930 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
31940 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
31950 20 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d   assert( nData==
31960 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
31970 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d   nZero==0 );.  }
31980 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75  .  nHeader += pu
31990 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
319a0 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29  Header], *(u64*)
319b0 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20  &nKey);.  .  /* 
319c0 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
319d0 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66  oad size */.  if
319e0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
319f0 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
31a00 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
31a10 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
31a20 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a   = 0;.  }else{ .
31a30 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6e 4b      if( NEVER(nK
31a40 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c  ey>0x7fffffff ||
31a50 20 70 4b 65 79 3d 3d 30 29 20 29 7b 0a 20 20 20   pKey==0) ){.   
31a60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
31a70 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
31a80 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
31a90 64 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  d = (int)nKey;. 
31aa0 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a     pSrc = pKey;.
31ab0 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29      nSrc = (int)
31ac0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
31ad0 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
31ae0 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
31af0 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
31b00 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
31b10 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
31b20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
31b30 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
31b40 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
31b50 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73  nSize = n;.    s
31b60 70 61 63 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c  paceLeft = nPayl
31b70 6f 61 64 3b 0a 20 20 20 20 70 50 72 69 6f 72 20  oad;.    pPrior 
31b80 3d 20 70 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65  = pCell;.  }else
31b90 7b 0a 20 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70  {.    int mn = p
31ba0 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
31bb0 20 20 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50      n = mn + (nP
31bc0 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28  ayload - mn) % (
31bd0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
31be0 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20  leSize - 4);.   
31bf0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
31c00 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
31c10 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
31c20 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
31c30 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
31c40 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63   > pPage->maxLoc
31c50 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20  al ) n = mn;.   
31c60 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a   spaceLeft = n;.
31c70 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20      *pnSize = n 
31c80 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
31c90 20 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65     pPrior = &pCe
31ca0 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20  ll[nHeader+n];. 
31cb0 20 7d 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20   }.  pPayload = 
31cc0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
31cd0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
31ce0 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73  oint variables s
31cf0 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20  hould be set as 
31d00 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
31d10 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20  **   nPayload   
31d20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61          Total pa
31d30 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79  yload size in by
31d40 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c  tes.  **   pPayl
31d50 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65  oad           Be
31d60 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c  gin writing payl
31d70 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20  oad here.  **   
31d80 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20  spaceLeft       
31d90 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62     Space availab
31da0 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20  le at pPayload. 
31db0 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61   If nPayload>spa
31dc0 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20  ceLeft,.  **    
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31de0 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e    that means con
31df0 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20  tent must spill 
31e00 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
31e10 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53  ges..  **   *pnS
31e20 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53  ize            S
31e30 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c  ize of the local
31e40 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74   cell (not count
31e50 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
31e60 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f  es).  **   pPrio
31e70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68  r             Wh
31e80 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
31e90 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72   pgno of the fir
31ea0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
31eb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61  .  **.  ** Use a
31ec0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61   call to btreePa
31ed0 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20  rseCellPtr() to 
31ee0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
31ef0 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a  values above.  *
31f00 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20  * were computed 
31f10 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
31f20 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
31f30 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  .  {.    CellInf
31f40 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 62 74 72 65  o info;.    btre
31f50 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
31f60 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
31f70 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
31f80 6e 48 65 61 64 65 72 3d 28 69 6e 74 29 28 69 6e  nHeader=(int)(in
31f90 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
31fa0 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ell) );.    asse
31fb0 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  rt( info.nKey==n
31fc0 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  Key );.    asser
31fd0 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e  t( *pnSize == in
31fe0 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20  fo.nSize );.    
31ff0 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65 66  assert( spaceLef
32000 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  t == info.nLocal
32010 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
32020 70 50 72 69 6f 72 20 3d 3d 20 26 70 43 65 6c 6c  pPrior == &pCell
32030 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
32040 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
32050 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
32060 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20  ayload into the 
32070 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61  local Cell and a
32080 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76  ny extra into ov
32090 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a  erflow pages */.
320a0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
320b0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
320c0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
320d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
320e0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
320f0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
32100 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
32110 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
32120 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
32130 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
32140 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
32150 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
32160 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
32170 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
32180 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
32190 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
321a0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
321b0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
321c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
321d0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
321e0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
321f0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
32200 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
32210 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
32220 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
32230 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
32240 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32250 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
32260 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
32270 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
32280 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
32290 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
322a0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
322b0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
322c0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
322d0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
322e0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
322f0 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
32300 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
32310 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
32320 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
32330 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
32340 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
32350 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
32360 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
32370 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
32380 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
32390 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
323a0 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
323b0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
323c0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
323d0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
323e0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
323f0 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
32400 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
32410 61 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e  alized values an
32420 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
32430 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
32440 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
32450 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
32460 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
32470 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
32480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32490 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
324a0 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
324b0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
324c0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
324d0 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
324e0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  (pBt, pgnoOvfl, 
324f0 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61  eType, pgnoPtrma
32500 70 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20  p, &rc);.       
32510 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
32520 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
32530 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
32540 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
32550 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
32560 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
32570 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
32580 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
32590 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
325a0 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
325b0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
325c0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
325d0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
325e0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
325f0 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
32600 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
32610 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
32620 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
32630 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
32640 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
32650 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32660 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
32670 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
32680 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
32690 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
326a0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
326b0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
326c0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
326d0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
326e0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
326f0 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
32700 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
32710 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
32720 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
32730 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
32740 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
32750 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
32760 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
32770 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
32780 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
32790 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
327a0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
327b0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
327c0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
327d0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
327e0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
327f0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
32800 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
32810 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
32820 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
32830 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
32840 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
32850 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
32860 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
32870 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
32880 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
32890 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
328a0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
328b0 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
328c0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
328d0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
328e0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
328f0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
32900 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
32910 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
32920 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
32930 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
32940 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
32950 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
32960 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
32970 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
32980 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
32990 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
329a0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
329b0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
329c0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
329d0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
329e0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
329f0 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
32a00 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
32a10 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
32a20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
32a30 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
32a40 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
32a50 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
32a60 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
32a70 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
32a80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
32a90 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
32aa0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
32ab0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
32ac0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
32ad0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
32ae0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
32af0 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
32b00 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
32b10 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
32b20 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
32b30 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
32b40 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
32b50 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
32b60 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
32b70 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
32b80 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
32b90 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
32ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32bb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
32bc0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
32bd0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
32be0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
32bf0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
32c00 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
32c10 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
32c20 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
32c30 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
32c40 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
32c50 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
32c60 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
32c70 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
32c80 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
32c90 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
32ca0 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
32cb0 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
32cc0 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
32cd0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
32ce0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
32cf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
32d00 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
32d10 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
32d20 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
32d30 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
32d40 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
32d50 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
32d60 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
32d70 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
32d80 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
32d90 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
32da0 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
32db0 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
32dc0 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
32dd0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
32de0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
32df0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
32e00 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
32e10 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
32e20 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
32e30 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
32e40 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
32e50 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
32e60 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28  turn;..  assert(
32e70 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
32e80 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
32e90 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
32ea0 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
32eb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
32ec0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
32ed0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
32ee0 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
32ef0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
32f00 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
32f10 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
32f20 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
32f30 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70 50 61  ta;.  ptr = &pPa
32f40 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69  ge->aCellIdx[2*i
32f50 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32  dx];.  pc = get2
32f60 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68 64 72  byte(ptr);.  hdr
32f70 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
32f80 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73 65 28  set;.  testcase(
32f90 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28 26 64   pc==get2byte(&d
32fa0 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20  ata[hdr+5]) );. 
32fb0 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a   testcase( pc+sz
32fc0 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
32fd0 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 69 66  ableSize );.  if
32fe0 28 20 70 63 20 3c 20 28 75 33 32 29 67 65 74 32  ( pc < (u32)get2
32ff0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
33000 5d 29 20 7c 7c 20 70 63 2b 73 7a 20 3e 20 70 50  ]) || pc+sz > pP
33010 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
33020 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43  Size ){.    *pRC
33030 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
33040 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
33050 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  rn;.  }.  rc = f
33060 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
33070 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
33080 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  c ){.    *pRC = 
33090 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
330a0 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
330b0 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67  ll--;.  if( pPag
330c0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
330d0 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b     memset(&data[
330e0 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
330f0 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
33100 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65   0;.    put2byte
33110 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
33120 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
33130 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67  eSize);.    pPag
33140 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65  e->nFree = pPage
33150 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
33160 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  e - pPage->hdrOf
33170 66 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20  fset.           
33180 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50              - pP
33190 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
331a0 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e - 8;.  }else{.
331b0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c      memmove(ptr,
331c0 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65   ptr+2, 2*(pPage
331d0 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b  ->nCell - idx));
331e0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
331f0 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
33200 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70  e->nCell);.    p
33210 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32  Page->nFree += 2
33220 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
33230 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c  nsert a new cell
33240 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c   on pPage at cel
33250 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43  l index "i".  pC
33260 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ell points to th
33270 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
33280 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  the cell..**.** 
33290 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  If the cell cont
332a0 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ent will fit on 
332b0 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70  the page, then p
332c0 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66  ut it there.  If
332d0 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20   it.** will not 
332e0 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  fit, then make a
332f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c   copy of the cel
33300 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70  l content into p
33310 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70  Temp if.** pTemp
33320 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52   is not null.  R
33330 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65  egardless of pTe
33340 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  mp, allocate a n
33350 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70  ew entry.** in p
33360 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61  Page->apOvfl[] a
33370 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
33380 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
33390 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
333a0 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
333b0 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
333c0 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
333d0 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
333e0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
333f0 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
33400 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
33410 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
33420 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
33430 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61  remented..*/.sta
33440 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
33450 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
33460 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
33470 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
33480 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
33490 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
334a0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
334b0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
334c0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
334d0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
334e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
334f0 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
33500 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
33510 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
33520 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
33530 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
33540 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
33550 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
33560 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
33570 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
33580 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
33590 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
335a0 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
335b0 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
335c0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
335d0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
335e0 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
335f0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
33600 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
33610 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
33620 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
33630 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
33640 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
33650 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
33660 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
33670 72 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  r */.  int end; 
33680 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
33690 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
336a0 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
336b0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
336c0 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
336d0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
336e0 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
336f0 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
33700 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
33710 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
33720 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
33730 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
33740 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
33750 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
33760 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
33770 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
33780 67 65 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52  ge */..  if( *pR
33790 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
337a0 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
337b0 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
337c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
337d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
337e0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
337f0 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
33800 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
33810 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
33820 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
33830 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
33840 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
33850 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
33860 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
33870 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
33880 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
33890 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
338a0 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
338b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
338c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
338d0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
338e0 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
338f0 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
33900 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
33910 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
33920 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
33930 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
33940 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
33950 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
33960 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
33970 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
33980 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
33990 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
339a0 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
339b0 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
339c0 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
339d0 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
339e0 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
339f0 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
33a00 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
33a10 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
33a20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
33a30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
33a40 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
33a50 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a  ert( sz==cellSiz
33a60 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  ePtr(pPage, pCel
33a70 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
33a80 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
33a90 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
33aa0 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
33ab0 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
33ac0 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
33ad0 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
33ae0 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20   pCell, sz);.   
33af0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
33b00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33b10 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
33b20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
33b30 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
33b40 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
33b50 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
33b60 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73  ssert( j<(int)(s
33b70 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
33b80 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
33b90 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29  e->apOvfl[0])) )
33ba0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
33bb0 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
33bc0 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
33bd0 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 20  l[j] = (u16)i;. 
33be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
33bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33c00 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
33c10 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
33c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33c30 0a 20 20 20 20 20 20 2a 70 52 43 20 3d 20 72 63  .      *pRC = rc
33c40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
33c50 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
33c60 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
33c70 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
33c80 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
33c90 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
33ca0 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
33cb0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
33cc0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
33cd0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
33ce0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
33cf0 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
33d00 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
33d10 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
33d20 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
33d30 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
33d40 20 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72   ){ *pRC = rc; r
33d50 65 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20  eturn; }.    /* 
33d60 54 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  The allocateSpac
33d70 65 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72  e() routine guar
33d80 61 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f  antees the follo
33d90 77 69 6e 67 20 74 77 6f 20 70 72 6f 70 65 72 74  wing two propert
33da0 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 74  ies.    ** if it
33db0 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
33dc0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
33dd0 69 64 78 20 3e 3d 20 65 6e 64 2b 32 20 29 3b 0a  idx >= end+2 );.
33de0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
33df0 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
33e00 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
33e10 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
33e20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
33e30 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31  ge->nFree -= (u1
33e40 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
33e50 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
33e60 5d 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  ], pCell, sz);. 
33e70 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
33e80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
33e90 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
33ea0 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ld);.    }.    m
33eb0 65 6d 6d 6f 76 65 28 26 64 61 74 61 5b 69 6e 73  emmove(&data[ins
33ec0 2b 32 5d 2c 20 26 64 61 74 61 5b 69 6e 73 5d 2c  +2], &data[ins],
33ed0 20 65 6e 64 2d 69 6e 73 29 3b 0a 20 20 20 20 70   end-ins);.    p
33ee0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
33ef0 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
33f00 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61  t2byte(&data[pPa
33f10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d  ge->hdrOffset+3]
33f20 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
33f30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33f40 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33f50 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
33f60 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
33f70 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
33f80 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
33f90 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
33fa0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
33fb0 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
33fc0 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
33fd0 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
33fe0 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
33ff0 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
34000 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
34010 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
34020 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
34030 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
34040 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
34050 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
34060 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65   pointers to nCe
34070 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65 20 63  ll b-tree page c
34080 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a  ells. The .** sz
34090 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e  Cell[] array con
340a0 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
340b0 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
340c0 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
340d0 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20  ion.** replaces 
340e0 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
340f0 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70 50 67  ents of page pPg
34100 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
34110 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a  ts of the cell.*
34120 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53  * array..**.** S
34130 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
34140 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79   in apCell[] may
34150 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74   currently be st
34160 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69  ored in pPg. Thi
34170 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f  s.** function wo
34180 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c  rks around probl
34190 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 74 68  ems caused by th
341a0 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63  is by making a c
341b0 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73  opy of any .** s
341c0 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  uch cells before
341d0 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
341e0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a   page data..**.*
341f0 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46  * The MemPage.nF
34200 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76  ree field is inv
34210 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69 73  alidated by this
34220 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73   function. It is
34230 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
34240 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
34250 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
34260 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
34270 61 74 69 63 20 76 6f 69 64 20 72 65 62 75 69 6c  atic void rebuil
34280 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65  dPage(.  MemPage
34290 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
342a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69 74           /* Edit
342b0 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
342c0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
342d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342e0 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
342f0 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
34300 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
34310 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
34320 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
34330 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
34340 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
34350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34360 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
34370 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  zes */.){.  cons
34380 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
34390 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20  >hdrOffset;     
343a0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
343b0 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67 20  f header on pPg 
343c0 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
343d0 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
343e0 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta;           /*
343f0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   Pointer to data
34400 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f   for pPg */.  co
34410 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53 69  nst int usableSi
34420 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
34430 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20  sableSize;.  u8 
34440 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26  * const pEnd = &
34450 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  aData[usableSize
34460 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38  ];.  int i;.  u8
34470 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50 67   *pCellptr = pPg
34480 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38  ->aCellIdx;.  u8
34490 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
344a0 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
344b0 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
344c0 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a  ;.  u8 *pData;..
344d0 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
344e0 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  aData[hdr+5]);. 
344f0 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d   memcpy(&pTmp[i]
34500 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73 61  , &aData[i], usa
34510 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20  bleSize - i);.. 
34520 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20   pData = pEnd;. 
34530 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
34540 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
34550 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b  *pCell = apCell[
34560 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 65 6c  i];.    if( pCel
34570 6c 3e 61 44 61 74 61 20 26 26 20 70 43 65 6c 6c  l>aData && pCell
34580 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 70  <pEnd ){.      p
34590 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65  Cell = &pTmp[pCe
345a0 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20  ll - aData];.   
345b0 20 7d 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20   }.    pData -= 
345c0 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 6d  szCell[i];.    m
345d0 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43 65  emcpy(pData, pCe
345e0 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a  ll, szCell[i]);.
345f0 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43 65      put2byte(pCe
34600 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20  llptr, (pData - 
34610 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65  aData));.    pCe
34620 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
34630 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69  assert( szCell[i
34640 5d 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  ]==cellSizePtr(p
34650 50 67 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  Pg, pCell) );.  
34660 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67 2d  }..  /* The pPg-
34670 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20  >nFree field is 
34680 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65 63  now set incorrec
34690 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  tly. The caller 
346a0 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f 0a  will fix it. */.
346b0 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e    pPg->nCell = n
346c0 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76  Cell;.  pPg->nOv
346d0 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 70  erflow = 0;..  p
346e0 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  ut2byte(&aData[h
346f0 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75 74  dr+1], 0);.  put
34700 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72  2byte(&aData[hdr
34710 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29  +3], pPg->nCell)
34720 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
34730 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74  ata[hdr+5], pDat
34740 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61 44  a - aData);.  aD
34750 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78 30  ata[hdr+7] = 0x0
34760 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  0;.}../*.** Arra
34770 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
34780 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
34790 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
347a0 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
347b0 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
347c0 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
347d0 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
347e0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
347f0 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20  attempts to .** 
34800 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74  add the cells st
34810 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61  ored in the arra
34820 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49  y to page pPg. I
34830 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63  f it cannot (bec
34840 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
34850 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65  e needs to be de
34860 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72  fragmented befor
34870 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c  e the cells will
34880 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a   fit), non-zero.
34890 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
348a0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
348b0 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65  e cells are adde
348c0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
348d0 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72  zero is.** retur
348e0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ned..**.** Argum
348f0 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69  ent pCellptr poi
34900 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
34910 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65   entry in the ce
34920 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
34930 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67  .** (part of pag
34940 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61  e pPg) to popula
34950 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61  te. After cell a
34960 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74  pCell[0] is writ
34970 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61  ten to the.** pa
34980 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69  ge body, a 16-bi
34990 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74  t offset is writ
349a0 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e  ten to pCellptr.
349b0 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20   And so on, for 
349c0 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  each.** cell in 
349d0 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73  the array. It is
349e0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
349f0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
34a00 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  r to ensure.** t
34a10 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
34a20 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73  o overwrite this
34a30 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c   part of the cel
34a40 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e  l-pointer array.
34a50 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
34a60 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
34a70 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69  led, *ppData poi
34a80 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
34a90 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74   of the .** cont
34aa0 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65  ent area on page
34ab0 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a   pPg. If the siz
34ac0 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
34ad0 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65   area is extende
34ae0 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73  d,.** *ppData is
34af0 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
34b00 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
34b10 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  rt of the conten
34b20 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65  t area.** before
34b30 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
34b40 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d  * Finally, argum
34b50 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74  ent pBegin point
34b60 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d  s to the byte im
34b70 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
34b80 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ing the.** end o
34b90 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  f the space requ
34ba0 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67  ired by this pag
34bb0 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70  e for the cell-p
34bc0 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72  ointer area (for
34bd0 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20  .** all cells - 
34be0 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69  not just those i
34bf0 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63  nserted by the c
34c00 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66  urrent call). If
34c10 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
34c20 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74  area must be ext
34c30 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20  ended to before 
34c40 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
34c50 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  der to accomodat
34c60 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69  e all.** cells i
34c70 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e  n apCell[], then
34c80 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f   the cells do no
34c90 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65  t fit and non-ze
34ca0 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
34cb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
34cc0 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
34cd0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
34ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cf0 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20   /* Page to add 
34d00 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38  cells to */.  u8
34d10 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20   *pBegin,       
34d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34d30 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69   End of cell-poi
34d40 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
34d50 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20  u8 **ppData,    
34d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d70 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20  /* IN/OUT: Page 
34d80 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f  content -area po
34d90 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
34da0 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20  Cellptr,        
34db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
34dc0 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f  inter to cell-po
34dd0 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  inter area */.  
34de0 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
34df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
34e10 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67  ls to add to pPg
34e20 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
34e30 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
34e40 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
34e50 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36  f cells */.  u16
34e60 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20 20   *szCell        
34e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34e80 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73 69  Array of cell si
34e90 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zes */.){.  int 
34ea0 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  i;.  u8 *aData =
34eb0 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
34ec0 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61  8 *pData = *ppDa
34ed0 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  ta;.  const int 
34ee0 62 46 72 65 65 6c 69 73 74 20 3d 20 61 44 61 74  bFreelist = aDat
34ef0 61 5b 31 5d 20 7c 7c 20 61 44 61 74 61 5b 32 5d  a[1] || aData[2]
34f00 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
34f10 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68  UPT_DB || pPg->h
34f20 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  drOffset==0 );  
34f30 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
34f40 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20  d on page 1 */. 
34f50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
34f60 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
34f70 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b   sz = szCell[i];
34f80 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
34f90 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20   u8 *pSlot;.    
34fa0 69 66 28 20 62 46 72 65 65 6c 69 73 74 3d 3d 30  if( bFreelist==0
34fb0 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67   || (pSlot = pag
34fc0 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 20 73  eFindSlot(pPg, s
34fd0 7a 2c 20 26 72 63 2c 20 30 29 29 3d 3d 30 20 29  z, &rc, 0))==0 )
34fe0 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d  {.      pData -=
34ff0 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70   sz;.      if( p
35000 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65  Data<pBegin ) re
35010 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53  turn 1;.      pS
35020 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  lot = pData;.   
35030 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 53   }.    memcpy(pS
35040 6c 6f 74 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  lot, apCell[i], 
35050 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  sz);.    put2byt
35060 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c  e(pCellptr, (pSl
35070 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ot - aData));.  
35080 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
35090 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d  .  }.  *ppData =
350a0 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e   pData;.  return
350b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72   0;.}../*.** Arr
350c0 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
350d0 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
350e0 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
350f0 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
35100 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  l .** contains t
35110 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
35120 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65   of each such ce
35130 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
35140 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70  n adds the.** sp
35150 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ace associated w
35160 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e  ith each cell in
35170 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74 20   the array that 
35180 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
35190 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74  red .** within t
351a0 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74  he body of pPg t
351b0 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c  o the pPg free-l
351c0 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f  ist. The cell-po
351d0 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72  inters and other
351e0 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68  .** fields of th
351f0 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75  e page are not u
35200 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  pdated..**.** Th
35210 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
35220 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
35230 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64  mber of cells ad
35240 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ded to the free-
35250 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
35260 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72 61  int pageFreeArra
35270 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
35280 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
35290 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
352a0 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  edit */.  int nC
352b0 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
352c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c            /* Cel
352d0 6c 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  ls to delete */.
352e0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
352f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35300 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
35310 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  lls */.  u16 *sz
35320 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Cell            
35330 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
35340 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73 20  y of cell sizes 
35350 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e  */.){.  u8 * con
35360 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e  st aData = pPg->
35370 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f  aData;.  u8 * co
35380 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74  nst pEnd = &aDat
35390 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
353a0 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20  leSize];.  u8 * 
353b0 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26  const pStart = &
353c0 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66  aData[pPg->hdrOf
353d0 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e  fset + 8 + pPg->
353e0 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
353f0 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20   int nRet = 0;. 
35400 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70 46   int i;.  u8 *pF
35410 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ree = 0;.  int s
35420 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  zFree = 0;..  fo
35430 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
35440 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
35450 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
35460 0a 20 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d  .    if( pCell>=
35470 70 53 74 61 72 74 20 26 26 20 70 43 65 6c 6c 3c  pStart && pCell<
35480 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 6e  pEnd ){.      in
35490 74 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 69 5d  t sz = szCell[i]
354a0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
354b0 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20  e!=(pCell + sz) 
354c0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
354d0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
354e0 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e    assert( pFree>
354f0 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20  aData && (pFree 
35500 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29  - aData)<65536 )
35510 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
35520 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
35530 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
35540 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20   szFree);.      
35550 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65    }.        pFre
35560 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
35570 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a     szFree = sz;.
35580 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
35590 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75  e+sz>pEnd ) retu
355a0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
355b0 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  e{.        pFree
355c0 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20   = pCell;.      
355d0 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a    szFree += sz;.
355e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
355f0 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  et++;.    }.  }.
35600 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
35610 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
35620 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
35630 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
35640 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61 63 65  );.    freeSpace
35650 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
35660 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
35670 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
35680 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nRet;.}../*.**
35690 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
356a0 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
356b0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e 64 20  pointers to and 
356c0 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c  sizes of all cel
356d0 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ls in the.** pag
356e0 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
356f0 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  d.  The current 
35700 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73 20 70  page, pPg, has p
35710 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20  Pg->nCell cells 
35720 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68  starting.** with
35730 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20   apCell[iOld].  
35740 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 2c  After balancing,
35750 20 74 68 69 73 20 70 61 67 65 20 73 68 6f 75 6c   this page shoul
35760 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65 6c 6c  d hold nNew cell
35770 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74  s.** starting at
35780 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a   apCell[iNew]..*
35790 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
357a0 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
357b0 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74  ssary adjustment
357c0 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68 61 74  s to pPg so that
357d0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20   it contains.** 
357e0 74 68 65 20 63 6f 72 72 65 63 74 20 63 65 6c 6c  the correct cell
357f0 73 20 61 66 74 65 72 20 62 65 69 6e 67 20 62 61  s after being ba
35800 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  lanced..**.** Th
35810 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65  e pPg->nFree fie
35820 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20 77 68  ld is invalid wh
35830 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
35840 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69 73 20   returns. It is 
35850 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  the.** responsib
35860 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
35870 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
35880 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
35890 69 63 20 76 6f 69 64 20 65 64 69 74 50 61 67 65  ic void editPage
358a0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67  (.  MemPage *pPg
358b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
358c0 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73      /* Edit this
358d0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
358e0 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Old,            
358f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
35900 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
35910 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70  l currently on p
35920 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65  age */.  int iNe
35930 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
35940 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
35950 78 20 6f 66 20 6e 65 77 20 66 69 72 73 74 20 63  x of new first c
35960 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  ell on page */. 
35970 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20 20   int nNew,      
35980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35990 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72   /* Final number
359a0 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67   of cells on pag
359b0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
359c0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
359d0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
359e0 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
359f0 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
35a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35a10 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
35a20 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  izes */.){.  u8 
35a30 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
35a40 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f  pPg->aData;.  co
35a50 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
35a60 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  g->hdrOffset;.  
35a70 75 38 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50  u8 *pBegin = &pP
35a80 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77  g->aCellIdx[nNew
35a90 20 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65   * 2];.  int nCe
35aa0 6c 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b  ll = pPg->nCell;
35ab0 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20         /* Cells 
35ac0 73 74 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f  stored on pPg */
35ad0 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20  .  u8 *pData;.  
35ae0 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20  u8 *pCellptr;.  
35af0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c  int i;.  int iOl
35b00 64 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50  dEnd = iOld + pP
35b10 67 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e  g->nCell + pPg->
35b20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74  nOverflow;.  int
35b30 20 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20   iNewEnd = iNew 
35b40 2b 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  + nNew;..#ifdef 
35b50 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
35b60 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  8 *pTmp = sqlite
35b70 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
35b80 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  pPg->pBt->pPager
35b90 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70  );.  memcpy(pTmp
35ba0 2c 20 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42  , aData, pPg->pB
35bb0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
35bc0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d  #endif..  /* Rem
35bd0 6f 76 65 20 63 65 6c 6c 73 20 66 72 6f 6d 20 74  ove cells from t
35be0 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
35bf0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
35c00 20 20 69 66 28 20 69 4f 6c 64 3c 69 4e 65 77 20    if( iOld<iNew 
35c10 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 69 66  ){.    int nShif
35c20 74 20 3d 20 70 61 67 65 46 72 65 65 41 72 72 61  t = pageFreeArra
35c30 79 28 0a 20 20 20 20 20 20 20 20 70 50 67 2c 20  y(.        pPg, 
35c40 69 4e 65 77 2d 69 4f 6c 64 2c 20 26 61 70 43 65  iNew-iOld, &apCe
35c50 6c 6c 5b 69 4f 6c 64 5d 2c 20 26 73 7a 43 65 6c  ll[iOld], &szCel
35c60 6c 5b 69 4f 6c 64 5d 0a 20 20 20 20 29 3b 0a 20  l[iOld].    );. 
35c70 20 20 20 6d 65 6d 6d 6f 76 65 28 70 50 67 2d 3e     memmove(pPg->
35c80 61 43 65 6c 6c 49 64 78 2c 20 26 70 50 67 2d 3e  aCellIdx, &pPg->
35c90 61 43 65 6c 6c 49 64 78 5b 6e 53 68 69 66 74 2a  aCellIdx[nShift*
35ca0 32 5d 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20  2], nCell*2);.  
35cb0 20 20 6e 43 65 6c 6c 20 2d 3d 20 6e 53 68 69 66    nCell -= nShif
35cc0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 4e 65  t;.  }.  if( iNe
35cd0 77 45 6e 64 20 3c 20 69 4f 6c 64 45 6e 64 20 29  wEnd < iOldEnd )
35ce0 7b 0a 20 20 20 20 6e 43 65 6c 6c 20 2d 3d 20 70  {.    nCell -= p
35cf0 61 67 65 46 72 65 65 41 72 72 61 79 28 0a 20 20  ageFreeArray(.  
35d00 20 20 20 20 20 20 70 50 67 2c 20 69 4f 6c 64 45        pPg, iOldE
35d10 6e 64 2d 69 4e 65 77 45 6e 64 2c 20 26 61 70 43  nd-iNewEnd, &apC
35d20 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 2c 20 26 73  ell[iNewEnd], &s
35d30 7a 43 65 6c 6c 5b 69 4e 65 77 45 6e 64 5d 0a 20  zCell[iNewEnd]. 
35d40 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 70 44 61     );.  }..  pDa
35d50 74 61 20 3d 20 26 61 44 61 74 61 5b 67 65 74 32  ta = &aData[get2
35d60 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 61 44 61  byteNotZero(&aDa
35d70 74 61 5b 68 64 72 2b 35 5d 29 5d 3b 0a 20 20 69  ta[hdr+5])];.  i
35d80 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20  f( pData<pBegin 
35d90 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f  ) goto editpage_
35da0 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  fail;..  /* Add 
35db0 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 73 74 61  cells to the sta
35dc0 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  rt of the page *
35dd0 2f 0a 20 20 69 66 28 20 69 4e 65 77 3c 69 4f 6c  /.  if( iNew<iOl
35de0 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 41 64  d ){.    int nAd
35df0 64 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 69 4f 6c  d = MIN(nNew,iOl
35e00 64 2d 69 4e 65 77 29 3b 0a 20 20 20 20 61 73 73  d-iNew);.    ass
35e10 65 72 74 28 20 28 69 4f 6c 64 2d 69 4e 65 77 29  ert( (iOld-iNew)
35e20 3c 6e 4e 65 77 20 7c 7c 20 6e 43 65 6c 6c 3d 3d  <nNew || nCell==
35e30 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
35e40 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20  );.    pCellptr 
35e50 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 3b  = pPg->aCellIdx;
35e60 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43  .    memmove(&pC
35e70 65 6c 6c 70 74 72 5b 6e 41 64 64 2a 32 5d 2c 20  ellptr[nAdd*2], 
35e80 70 43 65 6c 6c 70 74 72 2c 20 6e 43 65 6c 6c 2a  pCellptr, nCell*
35e90 32 29 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65  2);.    if( page
35ea0 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20  InsertArray(.   
35eb0 20 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67         pPg, pBeg
35ec0 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c  in, &pData, pCel
35ed0 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20 20 20  lptr,.          
35ee0 6e 41 64 64 2c 20 26 61 70 43 65 6c 6c 5b 69 4e  nAdd, &apCell[iN
35ef0 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65  ew], &szCell[iNe
35f00 77 5d 0a 20 20 20 20 29 20 29 20 67 6f 74 6f 20  w].    ) ) goto 
35f10 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 20  editpage_fail;. 
35f20 20 20 20 6e 43 65 6c 6c 20 2b 3d 20 6e 41 64 64     nCell += nAdd
35f30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
35f40 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
35f50 6c 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ls */.  for(i=0;
35f60 20 69 3c 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f   i<pPg->nOverflo
35f70 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  w; i++){.    int
35f80 20 69 43 65 6c 6c 20 3d 20 28 69 4f 6c 64 20 2b   iCell = (iOld +
35f90 20 70 50 67 2d 3e 61 69 4f 76 66 6c 5b 69 5d 29   pPg->aiOvfl[i])
35fa0 20 2d 20 69 4e 65 77 3b 0a 20 20 20 20 69 66 28   - iNew;.    if(
35fb0 20 69 43 65 6c 6c 3e 3d 30 20 26 26 20 69 43 65   iCell>=0 && iCe
35fc0 6c 6c 3c 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20  ll<nNew ){.     
35fd0 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70 50 67   pCellptr = &pPg
35fe0 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 43 65 6c 6c  ->aCellIdx[iCell
35ff0 20 2a 20 32 5d 3b 0a 20 20 20 20 20 20 6d 65 6d   * 2];.      mem
36000 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 32  move(&pCellptr[2
36010 5d 2c 20 70 43 65 6c 6c 70 74 72 2c 20 28 6e 43  ], pCellptr, (nC
36020 65 6c 6c 20 2d 20 69 43 65 6c 6c 29 20 2a 20 32  ell - iCell) * 2
36030 29 3b 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b  );.      nCell++
36040 3b 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65  ;.      if( page
36050 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 20  InsertArray(.   
36060 20 20 20 20 20 20 20 20 20 70 50 67 2c 20 70 42           pPg, pB
36070 65 67 69 6e 2c 20 26 70 44 61 74 61 2c 20 70 43  egin, &pData, pC
36080 65 6c 6c 70 74 72 2c 0a 20 20 20 20 20 20 20 20  ellptr,.        
36090 20 20 20 20 31 2c 20 26 61 70 43 65 6c 6c 5b 69      1, &apCell[i
360a0 43 65 6c 6c 20 2b 20 69 4e 65 77 5d 2c 20 26 73  Cell + iNew], &s
360b0 7a 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69 4e  zCell[iCell + iN
360c0 65 77 5d 0a 20 20 20 20 20 20 29 20 29 20 67 6f  ew].      ) ) go
360d0 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c  to editpage_fail
360e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
360f0 2a 20 41 70 70 65 6e 64 20 63 65 6c 6c 73 20 74  * Append cells t
36100 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
36110 20 70 61 67 65 20 2a 2f 0a 20 20 70 43 65 6c 6c   page */.  pCell
36120 70 74 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c  ptr = &pPg->aCel
36130 6c 49 64 78 5b 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  lIdx[nCell*2];. 
36140 20 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41   if( pageInsertA
36150 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50  rray(.        pP
36160 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61 74  g, pBegin, &pDat
36170 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20 20  a, pCellptr,.   
36180 20 20 20 20 20 6e 4e 65 77 2d 6e 43 65 6c 6c 2c       nNew-nCell,
36190 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43   &apCell[iNew+nC
361a0 65 6c 6c 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e  ell], &szCell[iN
361b0 65 77 2b 6e 43 65 6c 6c 5d 0a 20 20 29 20 29 20  ew+nCell].  ) ) 
361c0 67 6f 74 6f 20 65 64 69 74 70 61 67 65 5f 66 61  goto editpage_fa
361d0 69 6c 3b 0a 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  il;..  pPg->nCel
361e0 6c 20 3d 20 6e 4e 65 77 3b 0a 20 20 70 50 67 2d  l = nNew;.  pPg-
361f0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
36200 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
36210 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e  ta[hdr+3], pPg->
36220 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
36230 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
36240 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29  , pData - aData)
36250 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
36260 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30  _DEBUG.  for(i=0
36270 3b 20 69 3c 6e 4e 65 77 20 26 26 20 21 43 4f 52  ; i<nNew && !COR
36280 52 55 50 54 5f 44 42 3b 20 69 2b 2b 29 7b 0a 20  RUPT_DB; i++){. 
36290 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61     u8 *pCell = a
362a0 70 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 3b 0a 20  pCell[i+iNew];. 
362b0 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 67 65     int iOff = ge
362c0 74 32 62 79 74 65 28 26 70 50 67 2d 3e 61 43 65  t2byte(&pPg->aCe
362d0 6c 6c 49 64 78 5b 69 2a 32 5d 29 3b 0a 20 20 20  llIdx[i*2]);.   
362e0 20 69 66 28 20 70 43 65 6c 6c 3e 3d 61 44 61 74   if( pCell>=aDat
362f0 61 20 26 26 20 70 43 65 6c 6c 3c 26 61 44 61 74  a && pCell<&aDat
36300 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  a[pPg->pBt->usab
36310 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  leSize] ){.     
36320 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b 70   pCell = &pTmp[p
36330 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a 20  Cell - aData];. 
36340 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
36350 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 43 65 6c 6c   0==memcmp(pCell
36360 2c 20 26 61 44 61 74 61 5b 69 4f 66 66 5d 2c 20  , &aData[iOff], 
36370 73 7a 43 65 6c 6c 5b 69 2b 69 4e 65 77 5d 29 20  szCell[i+iNew]) 
36380 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
36390 20 72 65 74 75 72 6e 3b 0a 20 65 64 69 74 70 61   return;. editpa
363a0 67 65 5f 66 61 69 6c 3a 0a 20 20 2f 2a 20 55 6e  ge_fail:.  /* Un
363b0 61 62 6c 65 20 74 6f 20 65 64 69 74 20 74 68 69  able to edit thi
363c0 73 20 70 61 67 65 2e 20 52 65 62 75 69 6c 64 20  s page. Rebuild 
363d0 69 74 20 66 72 6f 6d 20 73 63 72 61 74 63 68 20  it from scratch 
363e0 69 6e 73 74 65 61 64 2e 20 2a 2f 0a 20 20 72 65  instead. */.  re
363f0 62 75 69 6c 64 50 61 67 65 28 70 50 67 2c 20 6e  buildPage(pPg, n
36400 4e 65 77 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65  New, &apCell[iNe
36410 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e 65 77  w], &szCell[iNew
36420 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ]);.}../*.** The
36430 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d   following param
36440 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20  eters determine 
36450 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e  how many adjacen
36460 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f  t pages get invo
36470 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c  lved.** in a bal
36480 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ancing operation
36490 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d  .  NN is the num
364a0 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
364b0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a   on either side.
364c0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  ** of the page t
364d0 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20  hat participate 
364e0 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67  in the balancing
364f0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20   operation.  NB 
36500 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20  is the.** total 
36510 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
36520 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
36530 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  , including the 
36540 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a  target page and.
36550 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20  ** NN neighbors 
36560 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a  on either side..
36570 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75  **.** The minimu
36580 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73  m value of NN is
36590 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20   1 (of course). 
365a0 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61   Increasing NN a
365b0 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20  bove 1.** (to 2 
365c0 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f  or 3) gives a mo
365d0 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74  dest improvement
365e0 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44   in SELECT and D
365f0 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63  ELETE performanc
36600 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65  e.** in exchange
36610 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65   for a larger de
36620 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53  gradation in INS
36630 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70  ERT and UPDATE p
36640 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54  erformance..** T
36650 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61  he value of NN a
36660 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74  ppears to give t
36670 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20  he best results 
36680 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66  overall..*/.#def
36690 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20  ine NN 1        
366a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
366b0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
366c0 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
366d0 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  age */.#define N
366e0 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20  B (NN*2+1)      
366f0 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69  /* Total pages i
36700 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62  nvolved in the b
36710 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e  alance */...#ifn
36720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36730 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
36740 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
36750 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
36760 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
36770 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
36780 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
36790 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
367a0 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
367b0 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
367c0 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
367d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
367e0 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
367f0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
36800 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
36810 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
36820 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
36830 72 79 69 6e 67 20 74 6f 20 62 61 6c 61 6e 63 65  rying to balance
36840 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
36850 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
36860 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
36870 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
36880 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
36890 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
368a0 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
368b0 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
368c0 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
368d0 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
368e0 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
368f0 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
36900 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
36910 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
36920 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
36930 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
36940 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
36950 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
36960 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
36970 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
36980 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
36990 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
369a0 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
369b0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
369c0 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
369d0 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
369e0 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
369f0 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
36a00 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
36a10 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
36a20 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
36a30 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
36a40 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
36a50 53 70 61 63 65 20 62 75 66 66 65 72 20 69 73 20  Space buffer is 
36a60 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20  used to store a 
36a70 74 65 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f  temporary copy o
36a80 66 20 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a  f the divider.**
36a90 20 63 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20   cell that will 
36aa0 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
36ab0 20 70 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61   pParent. Such a
36ac0 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
36ad0 66 20 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61  f a 4.** byte pa
36ae0 67 65 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77  ge number follow
36af0 65 64 20 62 79 20 61 20 76 61 72 69 61 62 6c 65  ed by a variable
36b00 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e   length integer.
36b10 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
36b20 64 73 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62  ds, at most 13 b
36b30 79 74 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20  ytes. Hence the 
36b40 70 53 70 61 63 65 20 62 75 66 66 65 72 20 6d 75  pSpace buffer mu
36b50 73 74 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73  st be at.** leas
36b60 74 20 31 33 20 62 79 74 65 73 20 69 6e 20 73 69  t 13 bytes in si
36b70 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
36b80 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  t balance_quick(
36b90 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
36ba0 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  , MemPage *pPage
36bb0 2c 20 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20  , u8 *pSpace){. 
36bc0 20 42 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74   BtShared *const
36bd0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
36be0 74 3b 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20  t;    /* B-Tree 
36bf0 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65  Database */.  Me
36c00 6d 50 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20  mPage *pNew;    
36c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
36c30 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
36c40 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
36c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c60 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
36c70 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ode */.  Pgno pg
36c80 6e 6f 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  noNew;          
36c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36ca0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
36cb0 70 4e 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pNew */..  asser
36cc0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
36cd0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
36ce0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
36cf0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
36d00 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
36d10 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
36d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
36d30 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31  ge->nOverflow==1
36d40 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 65   );..  /* This e
36d50 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 69  rror condition i
36d60 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
36d70 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
36d80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
36d90 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67    if( NEVER(pPag
36da0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 20 72  e->nCell==0) ) r
36db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
36dc0 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
36dd0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
36de0 70 61 67 65 2e 20 54 68 69 73 20 70 61 67 65 20  page. This page 
36df0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
36e00 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 6f 66  right-sibling of
36e10 20 0a 20 20 2a 2a 20 70 50 61 67 65 2e 20 4d 61   .  ** pPage. Ma
36e20 6b 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ke the parent pa
36e30 67 65 20 77 72 69 74 61 62 6c 65 2c 20 73 6f 20  ge writable, so 
36e40 74 68 61 74 20 74 68 65 20 6e 65 77 20 64 69 76  that the new div
36e50 69 64 65 72 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d  ider cell.  ** m
36e60 61 79 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ay be inserted. 
36e70 49 66 20 62 6f 74 68 20 74 68 65 73 65 20 6f 70  If both these op
36e80 65 72 61 74 69 6f 6e 73 20 61 72 65 20 73 75 63  erations are suc
36e90 63 65 73 73 66 75 6c 2c 20 70 72 6f 63 65 65 64  cessful, proceed
36ea0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
36eb0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
36ec0 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
36ed0 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 0a 20 20  oNew, 0, 0);..  
36ee0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36ef0 4b 20 29 7b 0a 0a 20 20 20 20 75 38 20 2a 70 4f  K ){..    u8 *pO
36f00 75 74 20 3d 20 26 70 53 70 61 63 65 5b 34 5d 3b  ut = &pSpace[4];
36f10 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
36f20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30   pPage->apOvfl[0
36f30 5d 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c  ];.    u16 szCel
36f40 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
36f50 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
36f60 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20     u8 *pStop;.. 
36f70 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
36f80 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36f90 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  le(pNew->pDbPage
36fa0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
36fb0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
36fc0 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  ==(PTF_INTKEY|PT
36fd0 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
36fe0 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f  EAF) );.    zero
36ff0 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49  Page(pNew, PTF_I
37000 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
37010 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20  TA|PTF_LEAF);.  
37020 20 20 72 65 62 75 69 6c 64 50 61 67 65 28 70 4e    rebuildPage(pN
37030 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
37040 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 70 4e 65  szCell);.    pNe
37050 77 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e  w->nFree = pBt->
37060 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 4e 65  usableSize - pNe
37070 77 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2d 20  w->cellOffset - 
37080 32 20 2d 20 73 7a 43 65 6c 6c 3b 0a 0a 20 20 20  2 - szCell;..   
37090 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
370a0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
370b0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
370c0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
370d0 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
370e0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
370f0 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
37100 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
37110 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
37120 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
37130 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65  rflow page. If e
37140 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20  ither of these. 
37150 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
37160 20 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75   fails, the retu
37170 72 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20  rn code is set, 
37180 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  but the contents
37190 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70  .    ** of the p
371a0 61 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73  arent page are s
371b0 74 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64  till manipulated
371c0 20 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c   by thh code bel
371d0 6f 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20  ow..    ** That 
371e0 69 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70  is Ok, at this p
371f0 6f 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20  oint the parent 
37200 70 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65  page is guarante
37210 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
37220 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
37230 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
37240 72 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61  ror code will ca
37250 75 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c  use a.    ** rol
37260 6c 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61  lback, undoing a
37270 6e 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  ny changes made 
37280 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
37290 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ge..    */.    i
372a0 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
372b0 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
372c0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
372d0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
372e0 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 2c 20 26 72  Parent->pgno, &r
372f0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  c);.      if( sz
37300 43 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  Cell>pNew->minLo
37310 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  cal ){.        p
37320 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
37330 70 4e 65 77 2c 20 70 43 65 6c 6c 2c 20 26 72 63  pNew, pCell, &rc
37340 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37350 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
37360 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
37370 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
37380 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
37390 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
373a0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
373b0 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
373c0 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
373d0 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
373e0 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
373f0 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
37400 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
37410 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
37420 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
37430 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
37440 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
37450 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
37460 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
37470 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
37480 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
37490 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
374a0 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
374b0 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
374c0 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
374d0 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
374e0 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
374f0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
37500 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
37510 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
37520 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
37530 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
37540 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
37550 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
37560 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
37570 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
37580 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
37590 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
375a0 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
375b0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
375c0 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
375d0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
375e0 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
375f0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
37600 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
37610 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
37620 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
37630 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
37640 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
37650 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
37660 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
37670 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
37680 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
37690 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
376a0 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
376b0 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
376c0 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
376d0 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
376e0 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
376f0 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
37700 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
37710 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
37720 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
37730 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
37740 61 72 65 6e 74 2c 20 70 50 61 72 65 6e 74 2d 3e  arent, pParent->
37750 6e 43 65 6c 6c 2c 20 70 53 70 61 63 65 2c 20 28  nCell, pSpace, (
37760 69 6e 74 29 28 70 4f 75 74 2d 70 53 70 61 63 65  int)(pOut-pSpace
37770 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
37780 20 20 30 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f    0, pPage->pgno
37790 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 2f 2a 20  , &rc);..    /* 
377a0 53 65 74 20 74 68 65 20 72 69 67 68 74 2d 63 68  Set the right-ch
377b0 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 70  ild pointer of p
377c0 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e 74 20  Parent to point 
377d0 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  to the new page.
377e0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
377f0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
37800 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
37810 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 29  set+8], pgnoNew)
37820 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65  ;.  .    /* Rele
37830 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
37840 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
37850 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
37860 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
37870 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
37880 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
37890 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
378a0 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a 2f 2a  NCE */..#if 0./*
378b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
378c0 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  n does not contr
378d0 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67 20 74  ibute anything t
378e0 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
378f0 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20 69 74  of SQLite..** it
37900 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20 61 63   is sometimes ac
37910 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72 61 72  tivated temporar
37920 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75 67 67  ily while debugg
37930 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f 6e 73  ing code respons
37940 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73 65 74  ible .** for set
37950 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d 61 70  ting pointer-map
37960 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
37970 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 43 68  tic int ptrmapCh
37980 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61 67 65  eckPages(MemPage
37990 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74 20 6e   **apPage, int n
379a0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 2c 20  Page){.  int i, 
379b0 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  j;.  for(i=0; i<
379c0 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  nPage; i++){.   
379d0 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75 38 20   Pgno n;.    u8 
379e0 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  e;.    MemPage *
379f0 70 50 61 67 65 20 3d 20 61 70 50 61 67 65 5b 69  pPage = apPage[i
37a00 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ];.    BtShared 
37a10 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
37a20 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
37a30 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
37a40 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
37a50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 6a 2b  pPage->nCell; j+
37a60 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e  +){.      CellIn
37a70 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 75  fo info;.      u
37a80 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20 20 20  8 *z;.     .    
37a90 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70    z = findCell(p
37aa0 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20 20 20  Page, j);.      
37ab0 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
37ac0 72 28 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66  r(pPage, z, &inf
37ad0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e  o);.      if( in
37ae0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
37af0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66          Pgno ovf
37b00 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b  l = get4byte(&z[
37b10 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
37b20 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70  ;.        ptrmap
37b30 47 65 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  Get(pBt, ovfl, &
37b40 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
37b50 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
37b60 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
37b70 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b  MAP_OVERFLOW1 );
37b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
37b90 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
37ba0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
37bb0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
37bc0 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  (z);.        ptr
37bd0 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
37be0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
37bf0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70      assert( n==p
37c00 50 61 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d  Page->pgno && e=
37c10 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b  =PTRMAP_BTREE );
37c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37c30 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
37c40 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
37c50 6f 20 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79  o child = get4by
37c60 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
37c70 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
37c80 74 2b 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72  t+8]);.      ptr
37c90 6d 61 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c  mapGet(pBt, chil
37ca0 64 2c 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20  d, &e, &n);.    
37cb0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
37cc0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
37cd0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
37ce0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
37cf0 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 1;.}.#endif../
37d00 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37d10 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  on is used to co
37d20 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  py the contents 
37d30 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
37d40 64 65 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e  de stored .** on
37d50 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70   page pFrom to p
37d60 61 67 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65  age pTo. If page
37d70 20 70 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61   pFrom was not a
37d80 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e   leaf page, then
37d90 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
37da0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
37db0 65 61 63 68 20 63 68 69 6c 64 20 70 61 67 65 20  each child page 
37dc0 61 72 65 20 75 70 64 61 74 65 64 20 73 6f 20 74  are updated so t
37dd0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e  hat the.** paren
37de0 74 20 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e  t page stored in
37df0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
37e00 20 69 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66   is page pTo. If
37e10 20 70 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64   pFrom contained
37e20 0a 2a 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69  .** any cells wi
37e30 74 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  th overflow page
37e40 20 70 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20   pointers, then 
37e50 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
37e60 67 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  g pointer.** map
37e70 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73   entries are als
37e80 6f 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  o updated so tha
37e90 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
37ea0 65 20 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a  e is page pTo..*
37eb0 2a 0a 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73  *.** If pFrom is
37ec0 20 63 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79   currently carry
37ed0 69 6e 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ing any overflow
37ee0 20 63 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20   cells (entries 
37ef0 69 6e 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67  in the.** MemPag
37f00 65 2e 61 70 4f 76 66 6c 5b 5d 20 61 72 72 61 79  e.apOvfl[] array
37f10 29 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ), they are not 
37f20 63 6f 70 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a  copied to pTo. .
37f30 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74  **.** Before ret
37f40 75 72 6e 69 6e 67 2c 20 70 61 67 65 20 70 54 6f  urning, page pTo
37f50 20 69 73 20 72 65 69 6e 69 74 69 61 6c 69 7a 65   is reinitialize
37f60 64 20 75 73 69 6e 67 20 62 74 72 65 65 49 6e 69  d using btreeIni
37f70 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  tPage()..**.** T
37f80 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f  he performance o
37f90 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
37fa0 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e  is not critical.
37fb0 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64   It is only used
37fc0 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61   by .** the bala
37fd0 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20  nce_shallower() 
37fe0 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  and balance_deep
37ff0 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c  er() procedures,
38000 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77   neither of.** w
38010 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20  hich are called 
38020 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d  often under norm
38030 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73  al circumstances
38040 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38050 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
38060 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
38070 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 2c 20 69   MemPage *pTo, i
38080 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
38090 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
380a0 4b 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  K ){.    BtShare
380b0 64 20 2a 20 63 6f 6e 73 74 20 70 42 74 20 3d 20  d * const pBt = 
380c0 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 20 20  pFrom->pBt;.    
380d0 75 38 20 2a 20 63 6f 6e 73 74 20 61 46 72 6f 6d  u8 * const aFrom
380e0 20 3d 20 70 46 72 6f 6d 2d 3e 61 44 61 74 61 3b   = pFrom->aData;
380f0 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  .    u8 * const 
38100 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44 61 74 61  aTo = pTo->aData
38110 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e 73 74 20  ;.    int const 
38120 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f 6d  iFromHdr = pFrom
38130 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
38140 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64   int const iToHd
38150 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d  r = ((pTo->pgno=
38160 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a  =1) ? 100 : 0);.
38170 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
38180 69 6e 74 20 69 44 61 74 61 3b 0a 20 20 0a 20 20  int iData;.  .  
38190 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
381a0 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
381b0 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
381c0 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
381d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  ;.    assert( ge
381e0 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46  t2byte(&aFrom[iF
381f0 72 6f 6d 48 64 72 2b 35 5d 29 20 3c 3d 20 28 69  romHdr+5]) <= (i
38200 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
38210 7a 65 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ze );.  .    /* 
38220 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65 20  Copy the b-tree 
38230 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72 6f  node content fro
38240 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f 20  m page pFrom to 
38250 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20 20  page pTo. */.   
38260 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74   iData = get2byt
38270 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64  e(&aFrom[iFromHd
38280 72 2b 35 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r+5]);.    memcp
38290 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
382a0 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
382b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
382c0 61 74 61 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ata);.    memcpy
382d0 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
382e0 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
382f0 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
38300 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
38310 65 6c 6c 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ell);.  .    /* 
38320 52 65 69 6e 69 74 69 61 6c 69 7a 65 20 70 61 67  Reinitialize pag
38330 65 20 70 54 6f 20 73 6f 20 74 68 61 74 20 74 68  e pTo so that th
38340 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
38350 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63 74  e MemPage struct
38360 75 72 65 0a 20 20 20 20 2a 2a 20 6d 61 74 63 68  ure.    ** match
38370 20 74 68 65 20 6e 65 77 20 64 61 74 61 2e 20 54   the new data. T
38380 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
38390 6e 20 6f 66 20 70 54 6f 20 63 61 6e 20 61 63 74  n of pTo can act
383a0 75 61 6c 6c 79 20 66 61 69 6c 20 75 6e 64 65 72  ually fail under
383b0 0a 20 20 20 20 2a 2a 20 66 61 69 72 6c 79 20 6f  .    ** fairly o
383c0 62 73 63 75 72 65 20 63 69 72 63 75 6d 73 74 61  bscure circumsta
383d0 6e 63 65 73 2c 20 65 76 65 6e 20 74 68 6f 75 67  nces, even thoug
383e0 68 20 69 74 20 69 73 20 61 20 63 6f 70 79 20 6f  h it is a copy o
383f0 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f initialized . 
38400 20 20 20 2a 2a 20 70 61 67 65 20 70 46 72 6f 6d     ** page pFrom
38410 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54 6f  ..    */.    pTo
38420 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
38430 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
38440 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 20 20 69  Page(pTo);.    i
38450 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
38460 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pR