/ Hex Artifact Content
Login

Artifact 2dfa99acdb2cffd9ed70413ad9657fc9d141ee51:


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 54 61 62 20  ){.        iTab 
1920: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1930: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1940: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1950: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1960: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1970: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1980: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
1990: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19a0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19b0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19c0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19d0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19e0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
19f0: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a00: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a10: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a20: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a30: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a40: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a50: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a60: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a70: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a80: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1a90: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1aa0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ab0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ac0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ad0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1ae0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1af0: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b00: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b10: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b20: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b30: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b40: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b50: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b60: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b70: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b80: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1b90: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1ba0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bb0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bc0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1bd0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1be0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1bf0: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c00: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c10: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c20: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c30: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c40: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c50: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c70: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c80: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1c90: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1ca0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cb0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cc0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1cd0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1ce0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1cf0: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d00: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d10: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d20: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d30: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d40: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d50: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d60: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d70: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d80: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1d90: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1da0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1db0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dc0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1dd0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1de0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1df0: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e00: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e10: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e20: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e30: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e40: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e50: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e60: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e70: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e80: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1e90: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1ea0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1eb0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ec0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ed0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ee0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1ef0: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f00: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f10: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f20: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f30: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f40: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f50: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f70: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f80: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1f90: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fa0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fb0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fc0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fd0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1fe0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
1ff0: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2000: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2010: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2020: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2030: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2040: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2050: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2060: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2070: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2080: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
2090: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20b0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20c0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20d0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20e0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
20f0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2100: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2110: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2120: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2130: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2140: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2150: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2160: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2170: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2180: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2190: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21a0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21b0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21c0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21d0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21e0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
21f0: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2200: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2210: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2220: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2230: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2240: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2250: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2260: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2270: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2280: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
2290: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22a0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22b0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22c0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22d0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22e0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22f0: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2300: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2310: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2320: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2330: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2340: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2350: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2360: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2370: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2380: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
2390: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23b0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23c0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23d0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23e0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
23f0: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2400: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2410: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2420: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2430: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2440: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2450: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2460: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2470: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2480: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
2490: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24a0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24b0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24c0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24d0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24e0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
24f0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2500: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2510: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2520: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2530: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2540: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2550: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2560: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2570: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2580: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
2590: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25b0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25c0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25d0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25e0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
25f0: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2600: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2610: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2620: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2630: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2640: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2650: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2660: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2670: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2680: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
2690: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26b0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26c0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26d0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26e0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
26f0: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2700: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2710: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2720: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2730: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2740: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2750: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2760: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2770: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2780: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2790: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27a0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27b0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27c0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27d0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
27f0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2800: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2810: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2820: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2830: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2840: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2850: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2860: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2870: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2880: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
2890: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28a0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28b0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28c0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28d0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28e0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
28f0: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2900: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2910: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2920: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2930: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2940: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2950: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2960: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2970: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2980: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
2990: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29a0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29b0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29c0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29d0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29e0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
29f0: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a00: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a10: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a20: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a30: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a40: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a50: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a60: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a70: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a80: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2a90: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2aa0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ab0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ac0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ad0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ae0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2af0: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b00: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b10: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b20: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b30: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b50: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b60: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b70: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2b90: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2ba0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bb0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bc0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2bd0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2be0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2bf0: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c00: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c10: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c20: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c30: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c40: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c50: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c60: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c70: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c80: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2c90: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2ca0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cb0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cc0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2cd0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2ce0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2cf0: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d00: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d10: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d20: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d30: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d40: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d50: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d60: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d70: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d80: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2d90: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2da0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2db0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dc0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2dd0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2de0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2df0: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e10: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e20: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e30: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e40: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e50: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e60: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e70: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e80: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2e90: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2ea0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2eb0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ec0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ed0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ee0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2ef0: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f00: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f20: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f30: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f40: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f50: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f60: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f70: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f80: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2f90: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fa0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fb0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fc0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fd0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2fe0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
2ff0: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3000: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3010: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3020: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3030: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3040: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3050: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3060: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3070: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
3090: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30a0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30b0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30c0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30e0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
30f0: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3100: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3110: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3120: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3130: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3140: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3150: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3160: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3170: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3180: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
3190: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31a0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31b0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31c0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31d0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31e0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
31f0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3200: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3210: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3220: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3230: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3240: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3250: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3260: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3270: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3280: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
3290: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32a0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32b0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32c0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32d0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32e0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
32f0: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3300: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3310: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3320: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3330: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3340: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3360: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3370: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3380: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3390: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33a0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33b0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33c0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33d0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33e0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
33f0: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3400: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3410: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3420: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3430: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3440: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3450: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3460: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3470: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3480: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
3490: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34a0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34c0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34d0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34e0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
34f0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3500: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3510: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3520: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3530: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3540: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3550: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3560: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3570: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3580: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
3590: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35a0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35b0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35d0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35e0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
35f0: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3600: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3610: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3620: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3630: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3640: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3650: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3660: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3670: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3680: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
3690: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36b0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36c0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36e0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
36f0: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3700: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3710: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3720: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3730: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3740: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3750: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3760: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3770: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3780: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
3790: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37a0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37b0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37c0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37e0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
37f0: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3800: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3810: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3820: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3830: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3840: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3850: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3860: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3870: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3880: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3890: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38a0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38b0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38c0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38d0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38e0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
38f0: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3900: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3910: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3920: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3930: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3940: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3950: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3960: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3970: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3980: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
3990: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39a0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39b0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39c0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39e0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
39f0: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a00: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a10: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a20: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a30: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a40: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a50: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a60: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a70: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a80: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3a90: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3aa0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ab0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ac0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ad0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3ae0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3af0: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b00: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b10: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b40: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b50: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b60: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b70: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b80: 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  utex);.}.#endif.
3b90: 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74  ./*.** Invalidat
3ba0: 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
3bb0: 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72 73  ache of the curs
3bc0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
3bd0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
3be0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3bf0: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3c00: 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  e pBt..*/.#defin
3c10: 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72  e invalidateOver
3c20: 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 20  flowCache(pCur) 
3c30: 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
3c40: 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76  &= ~BTCF_ValidOv
3c50: 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c  fl)../*.** Inval
3c60: 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  idate the overfl
3c70: 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
3c80: 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f  he for all curso
3c90: 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20  rs opened.** on 
3ca0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
3cb0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
3cc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
3cd0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3ce0: 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72  flowCache(BtShar
3cf0: 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75  ed *pBt){.  BtCu
3d00: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
3d10: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
3d20: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
3d30: 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ) );.  for(p=pBt
3d40: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
3d50: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
3d60: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d70: 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d  wCache(p);.  }.}
3d80: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d90: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f  _OMIT_INCRBLOB./
3da0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
3db0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  on is called bef
3dc0: 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
3dd0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
3de0: 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61  table.** to inva
3df0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
3e00: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3e10: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3e20: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3e30: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3e40: 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
3e50: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   If argument isC
3e60: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72 75  learTable is tru
3e70: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74 69  e, then the enti
3e80: 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  re contents of t
3e90: 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20 61  he.** table is a
3ea0: 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65 74  bout to be delet
3eb0: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
3ec0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
3ed0: 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73  incrblob.** curs
3ee0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20  ors open on any 
3ef0: 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20 74  row within the t
3f00: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
3f10: 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a  age pgnoRoot..**
3f20: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
3f30: 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65  f argument isCle
3f40: 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73 65  arTable is false
3f50: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20 77  , then the row w
3f60: 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f  ith.** rowid iRo
3f70: 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c 61  w is being repla
3f80: 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  ced or deleted. 
3f90: 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e 76  In this case inv
3fa0: 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20  alidate.** only 
3fb0: 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20 63  those incrblob c
3fc0: 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
3fd0: 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f 77  hat specific row
3fe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3ff0: 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62   invalidateIncrb
4000: 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42 74  lobCursors(.  Bt
4010: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
4020: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
4030: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
4040: 65 63 6b 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  eck */.  i64 iRo
4050: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
4060: 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74 68   /* The rowid th
4070: 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61 6e  at might be chan
4080: 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ging */.  int is
4090: 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20 20  ClearTable      
40a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c 6c    /* True if all
40b0: 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67 20   rows are being 
40c0: 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20  deleted */.){.  
40d0: 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
40e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
40f0: 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61 73  Btree->pBt;.  as
4100: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
4110: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
4120: 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
4130: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
4140: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
4150: 20 20 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61    if( (p->curFla
4160: 67 73 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c  gs & BTCF_Incrbl
4170: 6f 62 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  ob)!=0.     && (
4180: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20  isClearTable || 
4190: 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52  p->info.nKey==iR
41a0: 6f 77 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ow).    ){.     
41b0: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
41c0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
41d0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
41e0: 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74 69    /* Stub functi
41f0: 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f 42  on when INCRBLOB
4200: 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a 20   is omitted */. 
4210: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
4220: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
4230: 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  rs(x,y,z).#endif
4240: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
4250: 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
4260: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
4270: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
4280: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
4290: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
42a0: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
42b0: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
42c0: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
42d0: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
42e0: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
42f0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
4300: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4310: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
4320: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
4330: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
4340: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
4350: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
4360: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
4370: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
4380: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
4390: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
43a0: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
43b0: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
43c0: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
43d0: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
43e0: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
43f0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4400: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
4410: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
4420: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
4430: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
4440: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
4450: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
4460: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
4470: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
4480: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
4490: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
44a0: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
44b0: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
44c0: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
44d0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
44e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
44f0: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4500: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
4510: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
4520: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
4530: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
4540: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
4550: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
4560: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
4570: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
4580: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
4590: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
45a0: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
45b0: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
45c0: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
45d0: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
45e0: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
45f0: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
4600: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
4610: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
4620: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
4630: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
4640: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4650: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
4660: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
4670: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
4680: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
4690: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
46a0: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
46b0: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
46c0: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
46d0: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
46e0: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
46f0: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
4700: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
4710: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
4720: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
4730: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
4740: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
4750: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
4760: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
4770: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
4780: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
4790: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
47a0: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
47b0: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
47c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
47d0: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
47e0: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
47f0: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4800: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4810: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4820: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4830: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
4840: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
4850: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
4860: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
4870: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
4880: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
4890: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
48a0: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
48b0: 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20 69  ove is omitted i
48c0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
48d0: 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65 61  ing bit is alrea
48e0: 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74 53  dy.** set in BtS
48f0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4900: 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20  t. The contents 
4910: 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61 72  of the bitvec ar
4920: 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20  e cleared.** at 
4930: 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79  the end of every
4940: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
4950: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
4960: 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42  eSetHasContent(B
4970: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4980: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
4990: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
49a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
49b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 61  Content ){.    a
49c0: 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42 74  ssert( pgno<=pBt
49d0: 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 70  ->nPage );.    p
49e0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
49f0: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
4a00: 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67 65  reate(pBt->nPage
4a10: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74 2d  );.    if( !pBt-
4a20: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a  >pHasContent ){.
4a30: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
4a40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
4a50: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
4a60: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
4a70: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
4a80: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
4a90: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
4aa0: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
4ab0: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
4ac0: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
4ad0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4ae0: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
4af0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4b00: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
4b10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4b20: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
4b30: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
4b40: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
4b50: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
4b60: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
4b70: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
4b80: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
4b90: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
4ba0: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
4bb0: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
4bc0: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
4bd0: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
4be0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
4bf0: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
4c00: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
4c10: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4c20: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
4c30: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
4c40: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
4c50: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
4c60: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
4c70: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
4c80: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
4c90: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
4ca0: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
4cb0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4cc0: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4cd0: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
4ce0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
4cf0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
4d00: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
4d10: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
4d20: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
4d30: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d40: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
4d50: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
4d60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
4d70: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
4d80: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
4d90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
4da0: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
4db0: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
4dc0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
4dd0: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
4de0: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
4df0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4e00: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
4e10: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
4e20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
4e30: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
4e40: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70 43  Page[i]);.    pC
4e50: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20  ur->apPage[i] = 
4e60: 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  0;.  }.  pCur->i
4e70: 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 0a 2f  Page = -1;.}.../
4e80: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
4e90: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
4ea0: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
4eb0: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
4ec0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
4ed0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
4ee0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
4ef0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
4f00: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a  REQUIRESEEK..**.
4f10: 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
4f20: 73 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  st ensure that t
4f30: 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
4f40: 69 64 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d  id (has eState==
4f50: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a  CURSOR_VALID).**
4f60: 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
4f70: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
4f80: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
4f90: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
4fa0: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
4fb0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  r){.  int rc;.. 
4fc0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
4fd0: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
4fe0: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
4ff0: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5000: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5010: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5020: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
5030: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
5040: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
5050: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
5060: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
5070: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
5080: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
5090: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
50a0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
50b0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
50c0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
50d0: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
50e0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
50f0: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
5100: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5110: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
5120: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
5130: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
5140: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
5150: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5160: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
5170: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
5180: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
5190: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
51a0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
51b0: 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66   data..  */.  if
51c0: 28 20 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ( 0==pCur->apPag
51d0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
51e0: 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d      void *pKey =
51f0: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20   sqlite3Malloc( 
5200: 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20  pCur->nKey );.  
5210: 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20    if( pKey ){.  
5220: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5230: 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
5240: 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  , (int)pCur->nKe
5250: 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, pKey);.      
5260: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5270: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
5280: 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a  r->pKey = pKey;.
5290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
52a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
52b0: 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d  e(pKey);.      }
52c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
52d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
52e0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
52f0: 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e   assert( !pCur->
5300: 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
5310: 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79  y || !pCur->pKey
5320: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
5330: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5340: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5350: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
5360: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5370: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5380: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5390: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
53a0: 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20  owCache(pCur);. 
53b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
53c0: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
53d0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
53e0: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
53f0: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
5400: 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50 67  ist(BtCursor*,Pg
5410: 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a 0a  no,BtCursor*);..
5420: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
5430: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
5440: 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74 20  cursors (except 
5450: 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61 72  pExcept) that ar
5460: 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65  e open on.** the
5470: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
5480: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22 53  -page iRoot.  "S
5490: 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  aving the cursor
54a0: 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e 73   position" means
54b0: 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f 63   that.** the loc
54c0: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74 72  ation in the btr
54d0: 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65 64  ee is remembered
54e0: 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
54f0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a  hat it can be.**
5500: 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20 74   moved back to t
5510: 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66 74  he same spot aft
5520: 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61 73  er the btree has
5530: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
5540: 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   This.** routine
5550: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
5560: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70 45  before cursor pE
5570: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
5580: 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20 74   modify the.** t
5590: 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70 6c  able, for exampl
55a0: 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74 65  e in BtreeDelete
55b0: 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72  () or BtreeInser
55c0: 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65  t()..**.** Imple
55d0: 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20  mentation note: 
55e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65   This routine me
55f0: 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73  rely checks to s
5600: 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  ee if any cursor
5610: 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20  s.** need to be 
5620: 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73  saved.  It calls
5630: 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73   out to saveCurs
5640: 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74  orsOnList() in t
5650: 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20  he (unusual).** 
5660: 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f  event that curso
5670: 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74  rs are in need t
5680: 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a  o being saved..*
5690: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
56a0: 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68  eAllCursors(BtSh
56b0: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
56c0: 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20  iRoot, BtCursor 
56d0: 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43  *pExcept){.  BtC
56e0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
56f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5700: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5710: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
5720: 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45  pExcept==0 || pE
5730: 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20  xcept->pBt==pBt 
5740: 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e  );.  for(p=pBt->
5750: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
5760: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
5770: 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28   p!=pExcept && (
5780: 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70  0==iRoot || p->p
5790: 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20  gnoRoot==iRoot) 
57a0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
57b0: 65 74 75 72 6e 20 70 20 3f 20 73 61 76 65 43 75  eturn p ? saveCu
57c0: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69  rsorsOnList(p, i
57d0: 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 20 3a  Root, pExcept) :
57e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
57f0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5800: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5810: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5820: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5830: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5840: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5850: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5860: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
5870: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
5880: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
5890: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
58a0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
58b0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
58c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
58d0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
58e0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
58f0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
5900: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
5910: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
5920: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
5930: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5940: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
5950: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
5960: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
5970: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
5980: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
5990: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
59a0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
59b0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
59c0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
59d0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
59e0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
59f0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
5a00: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
5a10: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
5a20: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5a30: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5a40: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5a50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
5a60: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5a70: 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  LID ){.        i
5a80: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
5a90: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
5aa0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
5ab0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
5ac0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
5ad0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5af0: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
5b00: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
5b10: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
5b20: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
5b30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
5b40: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
5b50: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
5b60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
5b80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
5b90: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
5ba0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
5bb0: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
5bc0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5bd0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5be0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5bf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
5c00: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
5c10: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5c20: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
5c30: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5c40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
5c50: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
5c60: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
5c70: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
5c80: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
5c90: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
5ca0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
5cb0: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
5cc0: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
5cd0: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
5ce0: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
5cf0: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
5d00: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
5d10: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
5d20: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
5d30: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
5d40: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
5d50: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
5d60: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
5d70: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
5d80: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
5d90: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
5da0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
5db0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
5dc0: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
5dd0: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
5de0: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
5df0: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
5e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
5e10: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
5e20: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
5e30: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
5e40: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
5e50: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
5e60: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
5e90: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
5ea0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
5eb0: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
5ec0: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
5ed0: 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20  r aSpace[200];  
5ee0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
5ef0: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
5f00: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
5f10: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
5f20: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
5f30: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
5f40: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
5f50: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
5f60: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
5f70: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
5f80: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
5f90: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
5fa0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
5fb0: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
5fc0: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
5fd0: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
5fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5ff0: 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
6000: 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
6010: 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
6020: 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79   (int)nKey, pKey
6030: 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
6040: 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69  if( pIdxKey->nFi
6050: 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eld==0 ){.      
6060: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6070: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6080: 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20  , pFree);.      
6090: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
60a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
60b0: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
60c0: 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  IdxKey = 0;.  }.
60d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
60e0: 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
60f0: 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c  d(pCur, pIdxKey,
6100: 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65   nKey, bias, pRe
6110: 73 29 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20  s);.  if( pFree 
6120: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
6130: 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49  Free(pCur->pKeyI
6140: 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b  nfo->db, pFree);
6150: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
6170: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
6180: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
6190: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
61a0: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
61b0: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
61c0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
61d0: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
61e0: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
61f0: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
6200: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
6210: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
6220: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6230: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
6240: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
6250: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
6260: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
6270: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
6280: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
6290: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
62a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
62b0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
62c0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
62d0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
62e0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
62f0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
6300: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6310: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6320: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6330: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6340: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6350: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6360: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6370: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6380: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6390: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
63a0: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
63b0: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
63c0: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
63d0: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 29 3b  pCur->skipNext);
63e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
63f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
6400: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6410: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
6420: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
6430: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
6440: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
6450: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
6460: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
6470: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
6480: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
6490: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
64a0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
64b0: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
64c0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
64d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
64e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
64f0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
6500: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
6510: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
6520: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6530: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
6540: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6550: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
6560: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
6570: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
6580: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
6590: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
65a0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
65b0: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
65c0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
65d0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
65e0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
65f0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
6600: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
6610: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
6620: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
6630: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
6640: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
6650: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
6660: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
6670: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
6680: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
6690: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
66a0: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
66b0: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
66c0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
66d0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
66e0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
66f0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
6700: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
6710: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
6720: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
6730: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
6740: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
6750: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
6760: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
6770: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6780: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
6790: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
67a0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
67b0: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
67c0: 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
67d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
67e0: 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20  stores a cursor 
67f0: 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67  back to its orig
6800: 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66  inal position af
6810: 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65  ter it.** has be
6820: 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65  en moved by some
6830: 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74   outside activit
6840: 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72  y (such as a btr
6850: 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a  ee rebalance or.
6860: 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20  ** a row having 
6870: 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
6880: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
6890: 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a  cursor).  .**.**
68a0: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65   On success, the
68b0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
68c0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c  parameter is fal
68d0: 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  se if the cursor
68e0: 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e   is left.** poin
68f0: 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20  ting at exactly 
6900: 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a  the same row.  *
6910: 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20  pDifferntRow is 
6920: 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
6930: 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69  or.** was pointi
6940: 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64  ng to has been d
6950: 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20  eleted, forcing 
6960: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f  the cursor to po
6970: 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e  int to some.** n
6980: 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a  earby row..**.**
6990: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
69a0: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
69b0: 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72  led for a cursor
69c0: 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72   that just retur
69d0: 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d  ned.** TRUE from
69e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
69f0: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a  sorHasMoved()..*
6a00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
6a10: 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  eeCursorRestore(
6a20: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
6a30: 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52  int *pDifferentR
6a40: 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ow){.  int rc;..
6a50: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
6a60: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
6a70: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
6a80: 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72  SOR_VALID );.  r
6a90: 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
6aa0: 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
6ab0: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
6ac0: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
6ad0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
6ae0: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
6af0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6b00: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 4e 45 56 45  OR_VALID || NEVE
6b10: 52 28 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  R(pCur->skipNext
6b20: 21 3d 30 29 20 29 7b 0a 20 20 20 20 2a 70 44 69  !=0) ){.    *pDi
6b30: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a  fferentRow = 1;.
6b40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 44    }else{.    *pD
6b50: 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b  ifferentRow = 0;
6b60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6b70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
6b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6b90: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
6ba0: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
6bb0: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
6bc0: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
6bd0: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
6be0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
6bf0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
6c00: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
6c10: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
6c20: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
6c30: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
6c40: 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20  Return 0 (not a 
6c50: 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20  valid page) for 
6c60: 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68  pgno==1 since th
6c70: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69  ere is.** no poi
6c80: 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61  nter map associa
6c90: 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31 2e  ted with page 1.
6ca0: 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f    The integrity_
6cb0: 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72  check logic.** r
6cc0: 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74 72  equires that ptr
6cd0: 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d  mapPageno(*,1)!=
6ce0: 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  1..*/.static Pgn
6cf0: 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42  o ptrmapPageno(B
6d00: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
6d10: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20  no pgno){.  int 
6d20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6d30: 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70  ;.  Pgno iPtrMap
6d40: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
6d50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6d60: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6d70: 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20  );.  if( pgno<2 
6d80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50  ) return 0;.  nP
6d90: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d  agesPerMapPage =
6da0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
6db0: 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61  e/5)+1;.  iPtrMa
6dc0: 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61  p = (pgno-2)/nPa
6dd0: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
6de0: 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a   ret = (iPtrMap*
6df0: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
6e00: 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65  ) + 2; .  if( re
6e10: 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
6e20: 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
6e30: 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65   ret++;.  }.  re
6e40: 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a  turn ret;.}../*.
6e50: 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72  ** Write an entr
6e60: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
6e70: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
6e80: 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74  is routine updat
6e90: 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  es the pointer m
6ea0: 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67  ap entry for pag
6eb0: 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a  e number 'key'.*
6ec0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70  * so that it map
6ed0: 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65  s to type 'eType
6ee0: 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67  ' and parent pag
6ef0: 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e  e number 'pgno'.
6f00: 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69  .**.** If *pRC i
6f10: 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d  s initially non-
6f20: 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45  zero (non-SQLITE
6f30: 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72  _OK) then this r
6f40: 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e  outine is.** a n
6f50: 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72  o-op.  If an err
6f60: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61  or occurs, the a
6f70: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
6f80: 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e   code is written
6f90: 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a  .** into *pRC..*
6fa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
6fb0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
6fc0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
6fd0: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
6fe0: 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43  parent, int *pRC
6ff0: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
7000: 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f  Page;  /* The po
7010: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7020: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
7030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
7040: 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f  nter map data */
7050: 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b  .  Pgno iPtrmap;
7060: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
7070: 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d  ter map page num
7080: 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ber */.  int off
7090: 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66  set;       /* Of
70a0: 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20  fset in pointer 
70b0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
70c0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
70d0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
70e0: 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
70f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
7100: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
7110: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
7120: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
7130: 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20  ex) );.  /* The 
7140: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70  master-journal p
7150: 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  age number must 
7160: 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73  never be used as
7170: 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70   a pointer map p
7180: 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  age */.  assert(
7190: 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47   0==PTRMAP_ISPAG
71a0: 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42  E(pBt, PENDING_B
71b0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29  YTE_PAGE(pBt)) )
71c0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  ;..  assert( pBt
71d0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
71e0: 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a    if( key==0 ){.
71f0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7200: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7210: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7220: 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d    iPtrmap = PTRM
7230: 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b  AP_PAGENO(pBt, k
7240: 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ey);.  rc = sqli
7250: 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
7260: 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70  >pPager, iPtrmap
7270: 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69  , &pDbPage);.  i
7280: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7290: 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
72a0: 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
72b0: 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54   }.  offset = PT
72c0: 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69  RMAP_PTROFFSET(i
72d0: 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20  Ptrmap, key);.  
72e0: 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a  if( offset<0 ){.
72f0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
7300: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
7310: 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f      goto ptrmap_
7320: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65  exit;.  }.  asse
7330: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7340: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7350: 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d 61  ze-5 );.  pPtrma
7360: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7370: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7380: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
7390: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
73a0: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
73b0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
73c0: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
73d0: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
73e0: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
73f0: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
7400: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
7410: 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20 3d  ;.    *pRC= rc =
7420: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
7430: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
7440: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7450: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
7460: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
7470: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
7480: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
7490: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
74a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d  .    }.  }..ptrm
74b0: 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ap_exit:.  sqlit
74c0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
74d0: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
74e0: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
74f0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
7500: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
7510: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
7520: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
7530: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
7540: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
7550: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
7560: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
7570: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
7580: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
7590: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
75a0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
75b0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
75c0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
75d0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
75e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
75f0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
7600: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
7610: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
7620: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
7630: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
7640: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7650: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
7660: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
7670: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
7680: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
7690: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
76a0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
76b0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
76c0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
76d0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
76e0: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
76f0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
7700: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
7710: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7720: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
7730: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
7740: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
7750: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
7760: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
7770: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
7780: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
7790: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
77a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
77b0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
77c0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
77d0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
77e0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
77f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
7800: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
7810: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
7820: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
7830: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
7840: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7850: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7860: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7870: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7880: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7890: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
78a0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
78b0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
78c0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
78d0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
78e0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
78f0: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
7900: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7910: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
7920: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
7930: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
7940: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
7950: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
7960: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
7970: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
7980: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
7990: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
79a0: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
79b0: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
79c0: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
79d0: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
79e0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
79f0: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
7a00: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
7a10: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
7a20: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
7a30: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
7a40: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
7a50: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
7a60: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
7a70: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
7a80: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
7a90: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
7aa0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
7ab0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7ac0: 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   works only for 
7ad0: 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f  pages that do no
7ae0: 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c  t contain overfl
7af0: 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65  ow cells..*/.#de
7b00: 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c  fine findCell(P,
7b10: 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61  I) \.  ((P)->aDa
7b20: 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50  ta + ((P)->maskP
7b30: 61 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26  age & get2byte(&
7b40: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
7b50: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
7b60: 66 69 6e 64 43 65 6c 6c 76 32 28 44 2c 4d 2c 4f  findCellv2(D,M,O
7b70: 2c 49 29 20 28 44 2b 28 4d 26 67 65 74 32 62 79  ,I) (D+(M&get2by
7b80: 74 65 28 44 2b 28 4f 2b 32 2a 28 49 29 29 29 29  te(D+(O+2*(I))))
7b90: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61  ).../*.** This a
7ba0: 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65   more complex ve
7bb0: 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c  rsion of findCel
7bc0: 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66  l() that works f
7bd0: 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74  or.** pages that
7be0: 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72   do contain over
7bf0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 73  flow cells..*/.s
7c00: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
7c10: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
7c20: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
7c30: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
7c40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7c50: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
7c60: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
7c70: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
7c80: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
7c90: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
7ca0: 6e 74 20 6b 3b 0a 20 20 20 20 6b 20 3d 20 70 50  nt k;.    k = pP
7cb0: 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 69 5d 3b 0a  age->aiOvfl[i];.
7cc0: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
7cd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
7ce0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
7cf0: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e    return pPage->
7d00: 61 70 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 20  apOvfl[i];.     
7d10: 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d   }.      iCell--
7d20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7d30: 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50  turn findCell(pP
7d40: 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a  age, iCell);.}..
7d50: 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65  /*.** Parse a ce
7d60: 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b  ll content block
7d70: 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65   and fill in the
7d80: 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74   CellInfo struct
7d90: 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61  ure.  There.** a
7da0: 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
7db0: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
7dc0: 2e 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  .  btreeParseCel
7dd0: 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20  l() takes a .** 
7de0: 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68  cell index as th
7df0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7e00: 74 20 61 6e 64 20 62 74 72 65 65 50 61 72 73 65  t and btreeParse
7e10: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
7e20: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
7e30: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
7e40: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
7e50: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
7e60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
7e70: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
7e80: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
7e90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
7ea0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
7eb0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
7ec0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
7ed0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
7ee0: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
7ef0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
7f00: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
7f10: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
7f20: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  ucture */.){.  u
7f30: 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20  8 *pIter;       
7f40: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63         /* For sc
7f50: 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70  anning through p
7f60: 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50  Cell */.  u32 nP
7f70: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
7f80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
7f90: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
7fa0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
7fb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7fc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
7fd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
7fe0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
7ff0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
8000: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  eaf==1 );.  if( 
8010: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
8020: 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
8030: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8040: 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Size==0 );.    p
8050: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 67  Iter = pCell + g
8060: 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
8070: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
8080: 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72   pIter += getVar
8090: 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a  int(pIter, (u64*
80a0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
80b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
80c0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a  e->noPayload ){.
80d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
80e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
80f0: 3d 34 20 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  =4 );.    pInfo-
8100: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8110: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8120: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8130: 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f  nKey);.    pInfo
8140: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
8150: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8160: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f  l = 0;.    pInfo
8170: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
8180: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  .    pInfo->pPay
8190: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  load = 0;.    re
81a0: 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  turn;.  }else{. 
81b0: 20 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c     pIter = pCell
81c0: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
81d0: 74 72 53 69 7a 65 3b 0a 20 20 20 20 70 49 74 65  trSize;.    pIte
81e0: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
81f0: 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64  (pIter, nPayload
8200: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b  );.    pInfo->nK
8210: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
8220: 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79   }.  pInfo->nPay
8230: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
8240: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8250: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
8260: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
8270: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8280: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
8290: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
82a0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
82b0: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
82c0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
82d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
82e0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
82f0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
8300: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
8310: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
8320: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
8330: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
8340: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
8350: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
8360: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
8370: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
8380: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
8390: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
83a0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
83b0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
83c0: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
83d0: 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69  ad;.    pInfo->i
83e0: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
83f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
8400: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8410: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
8420: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
8430: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
8440: 20 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65      ** to decide
8450: 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f   how much to sto
8460: 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68  re locally and h
8470: 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c  ow much to spill
8480: 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65   onto.    ** ove
8490: 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68  rflow pages.  Th
84a0: 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  e strategy is to
84b0: 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d   minimize the am
84c0: 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20  ount of unused. 
84d0: 20 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f     ** space on o
84e0: 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68  verflow pages wh
84f0: 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20  ile keeping the 
8500: 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20  amount of local 
8510: 73 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69  storage.    ** i
8520: 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63  n between minLoc
8530: 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e  al and maxLocal.
8540: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57  .    **.    ** W
8550: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
8560: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
8570: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
8580: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
8590: 0a 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  .    ** way will
85a0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
85b0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
85c0: 66 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20  format..    */. 
85d0: 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b     int minLocal;
85e0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f    /* Minimum amo
85f0: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8600: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8610: 20 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b     int maxLocal;
8620: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f    /* Maximum amo
8630: 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68  unt of payload h
8640: 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20  eld locally */. 
8650: 20 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20     int surplus; 
8660: 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61    /* Overflow pa
8670: 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20  yload available 
8680: 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67  for local storag
8690: 65 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63  e */..    minLoc
86a0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  al = pPage->minL
86b0: 6f 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63  ocal;.    maxLoc
86c0: 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c  al = pPage->maxL
86d0: 6f 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75  ocal;.    surplu
86e0: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
86f0: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
8700: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
8710: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
8720: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
8730: 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63   surplus==maxLoc
8740: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
8750: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
8760: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
8770: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
8780: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
8790: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
87a0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
87b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
87c0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
87d0: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
87e0: 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69    }.    pInfo->i
87f0: 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29  Overflow = (u16)
8800: 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61  (&pInfo->pPayloa
8810: 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d  d[pInfo->nLocal]
8820: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 70   - pCell);.    p
8830: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49  Info->nSize = pI
8840: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b  nfo->iOverflow +
8850: 20 34 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63   4;.  }.}.static
8860: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
8870: 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
8880: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
8890: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
88a0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
88b0: 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20   int iCell,     
88c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
88d0: 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72  cell index.  Fir
88e0: 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a  st cell is 0 */.
88f0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
8900: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
8910: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
8920: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 62 74 72 65  ure */.){.  btre
8930: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
8940: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
8950: 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e  age, iCell), pIn
8960: 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  fo);.}../*.** Co
8970: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
8980: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
8990: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
89a0: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
89b0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
89c0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
89d0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
89e0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
89f0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
8a00: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
8a10: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
8a20: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
8a30: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
8a40: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
8a50: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ell pointer..*/.
8a60: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
8a70: 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  izePtr(MemPage *
8a80: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
8a90: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d  ){.  u8 *pIter =
8aa0: 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e   pCell + pPage->
8ab0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a  childPtrSize; /*
8ac0: 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
8ad0: 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c  r bytes of pCell
8ae0: 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20   */.  u8 *pEnd; 
8af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b10: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
8b20: 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32   varint */.  u32
8b30: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61        /* Size va
8b60: 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  lue to return */
8b70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
8b80: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
8b90: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
8ba0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
8bb0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
8bc0: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
8bd0: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
8be0: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
8bf0: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
8c00: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
8c10: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
8c20: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
8c30: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
8c40: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
8c50: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
8c60: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
8c70: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
8c80: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
8c90: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
8ca0: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 62  o debuginfo;.  b
8cb0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8cc0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
8cd0: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
8ce0: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
8cf0: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  >noPayload ){.  
8d00: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
8d10: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
8d20: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
8d30: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
8d40: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8d50: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
8d60: 3d 34 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =4 );.    return
8d70: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
8d80: 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 6e 53 69  Cell);.  }.  nSi
8d90: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
8da0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
8db0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
8dc0: 74 65 72 5b 39 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[9];.    nSiz
8dd0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
8de0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
8df0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
8e00: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
8e10: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
8e20: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
8e30: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
8e40: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
8e50: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
8e60: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
8e70: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
8e80: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
8e90: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
8ea0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
8eb0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
8ec0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
8ed0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
8ee0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
8ef0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
8f00: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
8f10: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
8f20: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
8f30: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
8f40: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
8f50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
8f60: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
8f70: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
8f80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
8f90: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
8fa0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
8fb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
8fc0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
8fd0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
8fe0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
8ff0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9000: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
9010: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
9020: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
9030: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
9040: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
9050: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
9060: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
9070: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
9080: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
9090: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
90a0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
90b0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
90c0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
90d0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
90e0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
90f0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9100: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
9110: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
9120: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
9130: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
9140: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
9150: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
9160: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
9170: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
9180: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
9190: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
91a0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
91b0: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
91c0: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
91d0: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
91e0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
91f0: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
9200: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
9210: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9220: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
9230: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
9240: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
9250: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
9260: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
9270: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9280: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
9290: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
92a0: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
92b0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
92c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
92d0: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
92e0: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
92f0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
9300: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
9310: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
9320: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9330: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
9340: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
9350: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20   u8 *pCell, int 
9360: 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66  *pRC){.  CellInf
9370: 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70  o info;.  if( *p
9380: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  RC ) return;.  a
9390: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
93a0: 29 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43  );.  btreeParseC
93b0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
93c0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
93d0: 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
93e0: 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  w ){.    Pgno ov
93f0: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
9400: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
9410: 6c 6f 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  low]);.    ptrma
9420: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
9430: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
9440: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
9450: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
9460: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
9470: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
9480: 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c  page given.  All
9490: 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64   Cells are moved
94a0: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
94b0: 66 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61  f the page and a
94c0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73  ll free space is
94d0: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
94e0: 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42  one.** big FreeB
94f0: 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69  lk that occurs i
9500: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65  n between the he
9510: 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a  ader and cell.**
9520: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61   pointer array a
9530: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
9540: 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20  ent area..**.** 
9550: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
9560: 34 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74  4582-60138 SQLit
9570: 65 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20  e may from time 
9580: 74 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69  to time reorgani
9590: 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ze a.** b-tree p
95a0: 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72  age so that ther
95b0: 65 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f  e are no freeblo
95c0: 63 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20  cks or fragment 
95d0: 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e  bytes, all.** un
95e0: 75 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63  used bytes are c
95f0: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20  ontained in the 
9600: 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  unallocated spac
9610: 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c  e region, and al
9620: 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70  l.** cells are p
9630: 61 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74  acked tightly at
9640: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9650: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
9660: 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61  int defragmentPa
9670: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
9680: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  e){.  int i;    
9690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
96b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20   */.  int pc;   
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
96e0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a  he i-th cell */.
96f0: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9710: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
9720: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
9730: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
9740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
9750: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
9760: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
9770: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9780: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
9790: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
97a0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
97b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
97c0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
97d0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
97e0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
97f0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
9800: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
9810: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
9820: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
9830: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
9840: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9850: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
9860: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
9870: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
9880: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
9890: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
98a0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
98b0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
98c0: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
98d0: 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  tent */.  unsign
98e0: 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20  ed char *src;   
98f0: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f       /* Source o
9900: 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69  f content */.  i
9910: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
9920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
9930: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
9940: 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
9950: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
9960: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
9970: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e  possible cell in
9980: 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72  dex */...  asser
9990: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
99a0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
99b0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
99c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
99d0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
99e0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
99f0: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
9a00: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
9a10: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
9a20: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
9a30: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9a40: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9a50: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9a60: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
9a70: 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74  = 0;.  src = dat
9a80: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
9a90: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
9aa0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65  >hdrOffset;.  ce
9ab0: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
9ac0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
9ad0: 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
9ae0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
9af0: 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28  nCell==get2byte(
9b00: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b  &data[hdr+3]) );
9b10: 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
9b20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9b30: 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d  leSize;.  cbrk =
9b40: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
9b50: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
9b60: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
9b70: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
9b80: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
9b90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
9ba0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
9bb0: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
9bc0: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
9bd0: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
9be0: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
9bf0: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
9c00: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
9c10: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
9c20: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
9c30: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
9c40: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
9c50: 61 73 74 20 29 3b 0a 23 69 66 20 21 64 65 66 69  ast );.#if !defi
9c60: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
9c70: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
9c80: 43 48 45 43 4b 29 0a 20 20 20 20 2f 2a 20 54 68  CHECK).    /* Th
9c90: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
9ca0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
9cb0: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
9cc0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
9cd0: 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45 4e   ** if SQLITE_EN
9ce0: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
9cf0: 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66 69  LL_CHECK is defi
9d00: 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned .    */.    
9d10: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
9d20: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
9d30: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
9d40: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9d50: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
9d60: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
9d70: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
9d80: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
9d90: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65  );.    size = ce
9da0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
9db0: 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20   &src[pc]);.    
9dc0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23 69  cbrk -= size;.#i
9dd0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
9de0: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
9df0: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
9e00: 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46   if( cbrk<iCellF
9e10: 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 72 65  irst ){.      re
9e20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9e30: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9e40: 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 63 62  #else.    if( cb
9e50: 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  rk<iCellFirst ||
9e60: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
9e70: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
9e80: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
9e90: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  PT_BKPT;.    }.#
9ea0: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
9eb0: 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61  ( cbrk+size<=usa
9ec0: 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e  bleSize && cbrk>
9ed0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
9ee0: 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72     testcase( cbr
9ef0: 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  k+size==usableSi
9f00: 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ze );.    testca
9f10: 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61  se( pc+size==usa
9f20: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70  bleSize );.    p
9f30: 75 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63  ut2byte(pAddr, c
9f40: 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65  brk);.    if( te
9f50: 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  mp==0 ){.      i
9f60: 6e 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20  nt x;.      if( 
9f70: 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69  cbrk==pc ) conti
9f80: 6e 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20  nue;.      temp 
9f90: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
9fa0: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
9fb0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
9fc0: 20 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28     x = get2byte(
9fd0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
9fe0: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d       memcpy(&tem
9ff0: 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20  p[x], &data[x], 
a000: 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29  (cbrk+size) - x)
a010: 3b 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65  ;.      src = te
a020: 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  mp;.    }.    me
a030: 6d 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d  mcpy(&data[cbrk]
a040: 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65  , &src[pc], size
a050: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
a060: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
a070: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
a080: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
a090: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
a0a0: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
a0b0: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
a0c0: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
a0d0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
a0e0: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
a0f0: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
a100: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a110: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
a120: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
a130: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
a140: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
a150: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
a160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a170: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
a180: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a190: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  K;.}../*.** Sear
a1a0: 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  ch the free-list
a1b0: 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72   on page pPg for
a1c0: 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20   space to store 
a1d0: 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74  a cell nByte byt
a1e0: 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49  es in.** size. I
a1f0: 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75  f one can be fou
a200: 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  nd, return a poi
a210: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63  nter to the spac
a220: 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a  e and remove it.
a230: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ** from the free
a240: 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  -list..**.** If 
a250: 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63  no suitable spac
a260: 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f  e can be found o
a270: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
a280: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a   return NULL..**
a290: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a2a0: 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72  n may detect cor
a2b0: 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70  ruption within p
a2c0: 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69  Pg.  If corrupti
a2d0: 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65  on is.** detecte
a2e0: 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73  d then *pRc is s
a2f0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52  et to SQLITE_COR
a300: 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73  RUPT and NULL is
a310: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
a320: 20 49 66 20 61 20 73 6c 6f 74 20 6f 66 20 61 74   If a slot of at
a330: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
a340: 65 73 20 69 73 20 66 6f 75 6e 64 20 62 75 74 20  es is found but 
a350: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 62  cannot be used b
a360: 65 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 72 65  ecause .** there
a370: 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 74 20   are already at 
a380: 6c 65 61 73 74 20 36 30 20 66 72 61 67 6d 65 6e  least 60 fragmen
a390: 74 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ted bytes on the
a3a0: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 4e 55   page, return NU
a3b0: 4c 4c 2e 0a 2a 2a 20 49 6e 20 74 68 69 73 20 63  LL..** In this c
a3c0: 61 73 65 2c 20 69 66 20 70 62 44 65 66 72 61 67  ase, if pbDefrag
a3d0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
a3e0: 74 20 4e 55 4c 4c 2c 20 73 65 74 20 2a 70 62 44  t NULL, set *pbD
a3f0: 65 66 72 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a  efrag to true..*
a400: 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67  /.static u8 *pag
a410: 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67  eFindSlot(MemPag
a420: 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74  e *pPg, int nByt
a430: 65 2c 20 69 6e 74 20 2a 70 52 63 2c 20 69 6e 74  e, int *pRc, int
a440: 20 2a 70 62 44 65 66 72 61 67 29 7b 0a 20 20 63   *pbDefrag){.  c
a450: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
a460: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
a470: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
a480: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
a490: 20 20 69 6e 74 20 69 41 64 64 72 3b 0a 20 20 69    int iAddr;.  i
a4a0: 6e 74 20 70 63 3b 0a 20 20 69 6e 74 20 75 73 61  nt pc;.  int usa
a4b0: 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70  bleSize = pPg->p
a4c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
a4d0: 0a 20 20 66 6f 72 28 69 41 64 64 72 3d 68 64 72  .  for(iAddr=hdr
a4e0: 2b 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79  +1; (pc = get2by
a4f0: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
a500: 29 29 3e 30 3b 20 69 41 64 64 72 3d 70 63 29 7b  ))>0; iAddr=pc){
a510: 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  .    int size;  
a520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a530: 65 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c  e of the free sl
a540: 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49  ot */.    /* EVI
a550: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36  DENCE-OF: R-0686
a560: 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c 6f 63  6-39125 Freebloc
a570: 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20 63 6f  ks are always co
a580: 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64 65 72  nnected in order
a590: 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65   of.    ** incre
a5a0: 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f  asing offset. */
a5b0: 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73 61 62  .    if( pc>usab
a5c0: 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69  leSize-4 || pc<i
a5d0: 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  Addr+4 ){.      
a5e0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
a5f0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a600: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
a610: 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  }.    /* EVIDENC
a620: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
a630: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
a640: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
a650: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
a660: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
a670: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
a680: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
a690: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
a6a0: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
a6b0: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
a6c0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
a6d0: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
a6e0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
a6f0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
a700: 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a   size>=nByte ){.
a710: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69        int x = si
a720: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
a730: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
a740: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a750: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
a760: 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20    if( x<4 ){.   
a770: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
a780: 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30  -OF: R-11498-580
a790: 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  22 In a well-for
a7a0: 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
a7b0: 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20   the total.     
a7c0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
a7d0: 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e  bytes in fragmen
a7e0: 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65  ts may not excee
a7f0: 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d 60. */.       
a800: 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37   if( aData[hdr+7
a810: 5d 3e 3d 36 30 20 29 7b 0a 20 20 20 20 20 20 20  ]>=60 ){.       
a820: 20 20 20 69 66 28 20 70 62 44 65 66 72 61 67 20     if( pbDefrag 
a830: 29 20 2a 70 62 44 65 66 72 61 67 20 3d 20 31 3b  ) *pbDefrag = 1;
a840: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a850: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
a860: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
a870: 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74   the slot from t
a880: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70  he free-list. Up
a890: 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  date the number 
a8a0: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72  of.        ** fr
a8b0: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
a8c0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
a8d0: 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  */.        memcp
a8e0: 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c  y(&aData[iAddr],
a8f0: 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b   &aData[pc], 2);
a900: 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68  .        aData[h
a910: 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a  dr+7] += (u8)x;.
a920: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a930: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
a940: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
a950: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
a960: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a970: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a980: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a990: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
a9a0: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
a9b0: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
a9c0: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
a9d0: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a 20  unt.         ** 
a9e0: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
a9f0: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
aa00: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
aa10: 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28         put2byte(
aa20: 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29  &aData[pc+2], x)
aa30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aa40: 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70 63  return &aData[pc
aa50: 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d   + x];.    }.  }
aa60: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
aa70: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
aa80: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
aa90: 70 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e  pace from within
aaa0: 20 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65   the B-Tree page
aab0: 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
aac0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
aad0: 2e 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49  . Write into *pI
aae0: 64 78 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  dx the index int
aaf0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
ab00: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74  .** of the first
ab10: 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74   byte of allocat
ab20: 65 64 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e  ed space. Return
ab30: 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f   either SQLITE_O
ab40: 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  K or.** an error
ab50: 20 63 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53   code (usually S
ab60: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a  QLITE_CORRUPT)..
ab70: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
ab80: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
ab90: 20 74 68 65 72 65 20 69 73 20 73 75 66 66 69 63   there is suffic
aba0: 69 65 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61  ient space to ma
abb0: 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ke the.** alloca
abc0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  tion.  This rout
abd0: 69 6e 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74  ine might need t
abe0: 6f 20 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20  o defragment in 
abf0: 6f 72 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a  order to bring.*
ac00: 2a 20 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20  * all the space 
ac10: 74 6f 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65  together, howeve
ac20: 72 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  r.  This routine
ac30: 20 77 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e   will avoid usin
ac40: 67 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  g.** the first t
ac50: 77 6f 20 62 79 74 65 73 20 70 61 73 74 20 74 68  wo bytes past th
ac60: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
ac70: 72 65 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d  rea since presum
ac80: 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c  ably this.** all
ac90: 6f 63 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  ocation is being
aca0: 20 6d 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74   made in order t
acb0: 6f 20 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63  o insert a new c
acc0: 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a  ell, so we will.
acd0: 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e  ** also end up n
ace0: 65 65 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c  eeding a new cel
acf0: 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  l pointer..*/.st
ad00: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
ad10: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
ad20: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
ad30: 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20  , int *pIdx){.  
ad40: 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20  const int hdr = 
ad50: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ad60: 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61  ;    /* Local ca
ad70: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64  che of pPage->hd
ad80: 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20  rOffset */.  u8 
ad90: 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
ada0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
adb0: 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65    /* Local cache
adc0: 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
add0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
ae00: 72 73 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c  rst byte of cell
ae10: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
ae20: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
ae30: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
ae40: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
ae50: 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  er return code *
ae60: 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20  /.  int gap;    
ae70: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ae80: 65 20 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e  e of gap between
ae90: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61   cell pointers a
aea0: 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  nd cell content 
aeb0: 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  */.  .  assert( 
aec0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
aed0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
aee0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
aef0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20  ert( pPage->pBt 
af00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
af10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
af20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
af30: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
af40: 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20  nByte>=0 );  /* 
af50: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
af60: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
af70: 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
af80: 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73  >=nByte );.  ass
af90: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
afa0: 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73  rflow==0 );.  as
afb0: 73 65 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69  sert( nByte < (i
afc0: 6e 74 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  nt)(pPage->pBt->
afd0: 75 73 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b  usableSize-8) );
afe0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
aff0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d  e->cellOffset ==
b000: 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50   hdr + 12 - 4*pP
b010: 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67  age->leaf );.  g
b020: 61 70 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ap = pPage->cell
b030: 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
b040: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b050: 74 28 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b  t( gap<=65536 );
b060: 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
b070: 46 3a 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31  F: R-29356-02391
b080: 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
b090: 20 75 73 65 73 20 61 20 36 35 35 33 36 2d 62 79   uses a 65536-by
b0a0: 74 65 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a  te page size.  *
b0b0: 2a 20 61 6e 64 20 74 68 65 20 72 65 73 65 72 76  * and the reserv
b0c0: 65 64 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f  ed space is zero
b0d0: 20 28 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75   (the usual valu
b0e0: 65 20 66 6f 72 20 72 65 73 65 72 76 65 64 20 73  e for reserved s
b0f0: 70 61 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20  pace).  ** then 
b100: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
b110: 20 6f 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d   offset of an em
b120: 70 74 79 20 70 61 67 65 20 77 61 6e 74 73 20 74  pty page wants t
b130: 6f 20 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a  o be 65536..  **
b140: 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69   However, that i
b150: 6e 74 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61  nteger is too la
b160: 72 67 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64  rge to be stored
b170: 20 69 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73   in a 2-byte uns
b180: 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67  igned.  ** integ
b190: 65 72 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f  er, so a value o
b1a0: 66 20 30 20 69 73 20 75 73 65 64 20 69 6e 20 69  f 0 is used in i
b1b0: 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74  ts place. */.  t
b1c0: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
b1d0: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
b1e0: 5d 29 3b 0a 20 20 69 66 28 20 67 61 70 3e 74 6f  ]);.  if( gap>to
b1f0: 70 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  p ) return SQLIT
b200: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b210: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
b220: 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62  s enough space b
b230: 65 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74  etween gap and t
b240: 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20  op for one more 
b250: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a  cell pointer.  *
b260: 2a 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66  * array entry of
b270: 66 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65  fset, and if the
b280: 20 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74   freelist is not
b290: 20 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61   empty, then sea
b2a0: 72 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65  rch the.  ** fre
b2b0: 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f  elist looking fo
b2c0: 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69  r a free slot bi
b2d0: 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69  g enough to sati
b2e0: 73 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e  sfy the request.
b2f0: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
b300: 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a  ( gap+2==top );.
b310: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
b320: 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74  1==top );.  test
b330: 63 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29  case( gap==top )
b340: 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 3c 3d 74  ;.  if( gap+2<=t
b350: 6f 70 20 26 26 20 28 64 61 74 61 5b 68 64 72 2b  op && (data[hdr+
b360: 31 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 32  1] || data[hdr+2
b370: 5d 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 44  ]) ){.    int bD
b380: 65 66 72 61 67 20 3d 20 30 3b 0a 20 20 20 20 75  efrag = 0;.    u
b390: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
b3a0: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
b3b0: 6e 42 79 74 65 2c 20 26 72 63 2c 20 26 62 44 65  nByte, &rc, &bDe
b3c0: 66 72 61 67 29 3b 0a 20 20 20 20 69 66 28 20 72  frag);.    if( r
b3d0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b3e0: 20 20 20 69 66 28 20 62 44 65 66 72 61 67 20 29     if( bDefrag )
b3f0: 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74   goto defragment
b400: 5f 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  _page;.    if( p
b410: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
b420: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
b430: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
b440: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
b450: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
b460: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
b470: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
b480: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b490: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
b4a0: 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f  request could no
b4b0: 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75  t be fulfilled u
b4c0: 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20  sing a freelist 
b4d0: 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a  slot.  Check.  *
b4e0: 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72  * to see if defr
b4f0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e  agmentation is n
b500: 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
b510: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
b520: 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20  +nByte==top );. 
b530: 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65   if( gap+2+nByte
b540: 3e 74 6f 70 20 29 7b 0a 20 64 65 66 72 61 67 6d  >top ){. defragm
b550: 65 6e 74 5f 70 61 67 65 3a 0a 20 20 20 20 61 73  ent_page:.    as
b560: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
b570: 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ll>0 || CORRUPT_
b580: 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  DB );.    rc = d
b590: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
b5a0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
b5b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
b5c0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
b5d0: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
b5e0: 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  r+5]);.    asser
b5f0: 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f  t( gap+nByte<=to
b600: 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20  p );.  }...  /* 
b610: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
b620: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
b630: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
b640: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
b650: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
b660: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20   content area.  
b670: 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61 67  The btreeInitPag
b680: 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72  e() call has alr
b690: 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61  eady.  ** valida
b6a0: 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73 74  ted the freelist
b6b0: 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74 68  .  Given that th
b6c0: 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76 61  e freelist is va
b6d0: 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20  lid, there.  ** 
b6e0: 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74  is no way that t
b6f0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61  he allocation ca
b700: 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65  n extend off the
b710: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
b720: 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72  ..  ** The asser
b730: 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69  t() below verifi
b740: 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  es the previous 
b750: 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  sentence..  */. 
b760: 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20   top -= nByte;. 
b770: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b780: 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20  hdr+5], top);.  
b790: 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74  assert( top+nByt
b7a0: 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d  e <= (int)pPage-
b7b0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b7c0: 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f   );.  *pIdx = to
b7d0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  p;.  return SQLI
b7e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b7f0: 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e  Return a section
b800: 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61   of the pPage->a
b810: 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65 65  Data to the free
b820: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72  list..** The fir
b830: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e  st byte of the n
b840: 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73  ew free block is
b850: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53   pPage->aData[iS
b860: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
b870: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
b880: 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74 65  ck is iSize byte
b890: 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e  s..**.** Adjacen
b8a0: 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65  t freeblocks are
b8b0: 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a   coalesced..**.*
b8c0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e  * Note that even
b8d0: 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65 65   though the free
b8e0: 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63  block list was c
b8f0: 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65 49  hecked by btreeI
b900: 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68  nitPage(),.** th
b910: 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  at routine will 
b920: 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c  not detect overl
b930: 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73  ap between cells
b940: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20   or freeblocks. 
b950: 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20   Nor.** does it 
b960: 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20  detect cells or 
b970: 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20  freeblocks that 
b980: 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68  encrouch into th
b990: 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  e reserved bytes
b9a0: 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f  .** at the end o
b9b0: 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20  f the page.  So 
b9c0: 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  do additional co
b9d0: 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20  rruption checks 
b9e0: 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72  inside this.** r
b9f0: 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72  outine and retur
ba00: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ba10: 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73   if any problems
ba20: 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   are found..*/.s
ba30: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
ba40: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
ba50: 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20  ge, u16 iStart, 
ba60: 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31  u16 iSize){.  u1
ba70: 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20 20  6 iPtr;         
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba90: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
baa0: 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72  f ptr to next fr
bab0: 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36  eeblock */.  u16
bac0: 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20   iFreeBlk;      
bad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bae0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
baf0: 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c   the next freebl
bb00: 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b  ock */.  u8 hdr;
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb30: 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73 69  * Page header si
bb40: 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f  ze.  0 or 100 */
bb50: 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b  .  u8 nFrag = 0;
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 2f 2a 20 52 65 64 75           /* Redu
bb80: 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e  ction in fragmen
bb90: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20  tation */.  u16 
bba0: 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a  iOrigSize = iSiz
bbb0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
bbc0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
bbd0: 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a  lue of iSize */.
bbe0: 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20 70 50    u32 iLast = pP
bbf0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
bc00: 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65  Size-4; /* Large
bc10: 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72 65 65  st possible free
bc20: 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
bc30: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
bc40: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
bc50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
bc60: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
bc70: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
bc80: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bc90: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
bca0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
bcb0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
bcc0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
bcd0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bce0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
bcf0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
bd00: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
bd10: 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 70 50  sert( iStart>=pP
bd20: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
bd30: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
bd40: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
bd50: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
bd60: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
bd70: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
bd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bd90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bda0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bdb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
bdc0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
bdd0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
bde0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
bdf0: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
be00: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
be10: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
be20: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
be30: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
be40: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
be50: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
be60: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
be70: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
be80: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
be90: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
bea0: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
beb0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
bec0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
bed0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
bee0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
bef0: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
bf00: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
bf10: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
bf20: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
bf30: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
bf40: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
bf50: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
bf60: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
bf70: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
bf80: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
bf90: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
bfa0: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
bfb0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
bfc0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
bfd0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
bfe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
bff0: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
c000: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
c010: 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65  Ptr]))>0 && iFre
c020: 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20  eBlk<iStart ){. 
c030: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
c040: 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72  k<iPtr+4 ) retur
c050: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c060: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74  _BKPT;.      iPt
c070: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
c080: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
c090: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
c0a0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c0b0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
c0c0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
c0d0: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
c0e0: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
c0f0: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
c100: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
c110: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
c120: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
c130: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
c140: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
c150: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
c160: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
c170: 20 69 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a   iFreeBlk.    **
c180: 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
c190: 20 73 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b   see if iFreeBlk
c1a0: 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65   should be coale
c1b0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
c1c0: 64 20 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20  d of iStart..   
c1d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65   */.    if( iFre
c1e0: 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d  eBlk && iEnd+3>=
c1f0: 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20  iFreeBlk ){.    
c200: 20 20 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42    nFrag = iFreeB
c210: 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20  lk - iEnd;.     
c220: 20 69 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42   if( iEnd>iFreeB
c230: 6c 6b 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  lk ) return SQLI
c240: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
c250: 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46  .      iEnd = iF
c260: 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74  reeBlk + get2byt
c270: 65 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b  e(&data[iFreeBlk
c280: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 53 69 7a  +2]);.      iSiz
c290: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
c2a0: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
c2b0: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
c2c0: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
c2d0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
c2e0: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
c2f0: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
c300: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
c310: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
c320: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
c330: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
c340: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
c350: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
c360: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
c370: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
c380: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
c390: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c3a0: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
c3b0: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
c3c0: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
c3d0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
c3e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
c3f0: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
c400: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
c410: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
c420: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c430: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
c440: 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61     nFrag += iSta
c450: 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20  rt - iPtrEnd;.  
c460: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
c470: 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20  nd - iPtr;.     
c480: 20 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72     iStart = iPtr
c490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c4a0: 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61      if( nFrag>da
c4b0: 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75  ta[hdr+7] ) retu
c4c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c4d0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61  T_BKPT;.    data
c4e0: 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67  [hdr+7] -= nFrag
c4f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61  ;.  }.  if( iSta
c500: 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  rt==get2byte(&da
c510: 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20  ta[hdr+5]) ){.  
c520: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65    /* The new fre
c530: 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65  eblock is at the
c540: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
c550: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
c560: 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a  rea,.    ** so j
c570: 75 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63  ust extend the c
c580: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c590: 20 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65   rather than cre
c5a0: 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  ate another.    
c5b0: 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72  ** freelist entr
c5c0: 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74  y */.    if( iPt
c5d0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
c5e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c5f0: 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62  _BKPT;.    put2b
c600: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  yte(&data[hdr+1]
c610: 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20  , iFreeBlk);.   
c620: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c630: 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20  hdr+5], iEnd);. 
c640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
c650: 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 66 72  nsert the new fr
c660: 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65  eeblock into the
c670: 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20   freelist */.   
c680: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
c690: 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a  iPtr], iStart);.
c6a0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
c6b0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
c6c0: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
c6d0: 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72 74  yte(&data[iStart
c6e0: 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  +2], iSize);.  }
c6f0: 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
c700: 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20  += iOrigSize;.  
c710: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c720: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
c730: 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
c740: 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65   (the first byte
c750: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20   of the header) 
c760: 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e  for a page.** an
c770: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65  d initialize fie
c780: 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  lds of the MemPa
c790: 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63  ge structure acc
c7a0: 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ordingly..**.** 
c7b0: 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  Only the followi
c7c0: 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  ng combinations 
c7d0: 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20  are supported.  
c7e0: 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65  Anything differe
c7f0: 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20  nt.** indicates 
c800: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
c810: 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20  se files:.**.** 
c820: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
c830: 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20  DATA.**         
c840: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50  PTF_ZERODATA | P
c850: 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20  TF_LEAF.**      
c860: 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20     PTF_LEAFDATA 
c870: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20  | PTF_INTKEY.** 
c880: 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46          PTF_LEAF
c890: 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45  DATA | PTF_INTKE
c8a0: 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a  Y | PTF_LEAF.*/.
c8b0: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
c8c0: 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a  eFlags(MemPage *
c8d0: 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42  pPage, int flagB
c8e0: 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  yte){.  BtShared
c8f0: 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20   *pBt;     /* A 
c900: 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70  copy of pPage->p
c910: 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  Bt */..  assert(
c920: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
c930: 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t==(pPage->pgno=
c940: 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b  =1 ? 100 : 0) );
c950: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c960: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
c970: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
c980: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61   );.  pPage->lea
c990: 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74  f = (u8)(flagByt
c9a0: 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20  e>>3);  assert( 
c9b0: 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33  PTF_LEAF == 1<<3
c9c0: 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26   );.  flagByte &
c9d0: 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70  = ~PTF_LEAF;.  p
c9e0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
c9f0: 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e  ze = 4-4*pPage->
ca00: 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50  leaf;.  pBt = pP
ca10: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
ca20: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
ca30: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
ca40: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
ca50: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
ca60: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
ca70: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
ca80: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
ca90: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
caa0: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
cab0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
cac0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
cad0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
cae0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
caf0: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
cb00: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
cb10: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
cb20: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
cb30: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
cb40: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
cb50: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
cb60: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
cb70: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
cb80: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
cb90: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
cba0: 4b 65 79 4c 65 61 66 20 3d 20 70 50 61 67 65 2d  KeyLeaf = pPage-
cbb0: 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  >leaf;.    pPage
cbc0: 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 21 70  ->noPayload = !p
cbd0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
cbe0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
cbf0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
cc00: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
cc10: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
cc20: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
cc30: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
cc40: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a  RODATA ){.    /*
cc50: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
cc60: 32 37 32 32 35 2d 35 33 39 33 36 20 41 20 76 61  27225-53936 A va
cc70: 6c 75 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74  lue of 2 means t
cc80: 68 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e  he page is an in
cc90: 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  terior.    ** in
cca0: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
ccb0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
ccc0: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
ccd0: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
cce0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31  ENCE-OF: R-16571
ccf0: 2d 31 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f  -11615 A value o
cd00: 66 20 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70  f 10 means the p
cd10: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
cd20: 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65    ** index b-tre
cd30: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
cd40: 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f  ssert( (PTF_ZERO
cd50: 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  DATA|PTF_LEAF)==
cd60: 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  10 );.    pPage-
cd70: 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20  >intKey = 0;.   
cd80: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
cd90: 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  af = 0;.    pPag
cda0: 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30  e->noPayload = 0
cdb0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
cdc0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
cdd0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
cde0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
cdf0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
ce00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
ce10: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
ce20: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
ce30: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
ce40: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
ce50: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
ce60: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
ce70: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ce80: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
ce90: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
cea0: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
ceb0: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
cec0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ced0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
cee0: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
cef0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
cf00: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
cf10: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
cf20: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
cf30: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
cf40: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
cf50: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
cf60: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
cf70: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
cf80: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
cf90: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
cfa0: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
cfb0: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
cfc0: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
cfd0: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
cfe0: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
cff0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
d000: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
d010: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
d020: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
d030: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
d040: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
d050: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
d060: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
d070: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
d080: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d090: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
d0a0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
d0b0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
d0c0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
d0d0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
d0e0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
d0f0: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
d100: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
d110: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
d120: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
d130: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
d140: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
d150: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
d160: 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50  e) );..  if( !pP
d170: 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
d180: 20 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20     u16 pc;      
d190: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d1a0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
d1b0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
d1c0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20  ata[] */.    u8 
d1d0: 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  hdr;            
d1e0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67  /* Offset to beg
d1f0: 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68  inning of page h
d200: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20  eader */.    u8 
d210: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
d220: 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67  /* Equal to pPag
d230: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20  e->aData */.    
d240: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
d250: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69        /* The mai
d260: 6e 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  n btree structur
d270: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61  e */.    int usa
d280: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
d290: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
d2a0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
d2b0: 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65  ge */.    u16 ce
d2c0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  llOffset;    /* 
d2d0: 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72  Offset from star
d2e0: 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72  t of page to fir
d2f0: 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
d300: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65  */.    int nFree
d310: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
d320: 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79  ber of unused by
d330: 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  tes on the page 
d340: 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20  */.    int top; 
d350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d360: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63  st byte of the c
d370: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
d380: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
d390: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
d3a0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
d3b0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
d3c0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e  offset */.    in
d3d0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
d3e0: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
d3f0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
d400: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20  ock offset */.. 
d410: 20 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e     pBt = pPage->
d420: 70 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20  pBt;..    hdr = 
d430: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d440: 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
d450: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f  ge->aData;.    /
d460: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d470: 2d 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65  -28594-02890 The
d480: 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61   one-byte flag a
d490: 74 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63  t offset 0 indic
d4a0: 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65  ating.    ** the
d4b0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70   b-tree page typ
d4c0: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65  e. */.    if( de
d4d0: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
d4e0: 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65   data[hdr]) ) re
d4f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d500: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
d510: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
d520: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
d530: 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
d540: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d   );.    pPage->m
d550: 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28  askPage = (u16)(
d560: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
d570: 31 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  1);.    pPage->n
d580: 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
d590: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
d5a0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
d5b0: 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f      pPage->cellO
d5c0: 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
d5d0: 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
d5e0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
d5f0: 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ze;.    pPage->a
d600: 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b  DataEnd = &data[
d610: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20  usableSize];.   
d620: 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
d630: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
d640: 73 65 74 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49  set];.    /* EVI
d650: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31  DENCE-OF: R-5801
d660: 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d  5-48175 The two-
d670: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
d680: 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61  offset 5 designa
d690: 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  tes.    ** the s
d6a0: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
d6b0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41   content area. A
d6c0: 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20   zero value for 
d6d0: 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a  this integer is.
d6e0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74      ** interpret
d6f0: 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a  ed as 65536. */.
d700: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
d710: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
d720: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20  hdr+5]);.    /* 
d730: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
d740: 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
d750: 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
d760: 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
d770: 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  s the.    ** num
d780: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
d790: 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  the page. */.   
d7a0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20   pPage->nCell = 
d7b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
d7c0: 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20  dr+3]);.    if( 
d7d0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f  pPage->nCell>MX_
d7e0: 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20  CELL(pBt) ){.   
d7f0: 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65     /* To many ce
d800: 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  lls for a single
d810: 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65   page.  The page
d820: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
d830: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
d840: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
d850: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
d860: 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
d870: 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28  >nCell==MX_CELL(
d880: 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45  pBt) );.    /* E
d890: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
d8a0: 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70  089-57979 If a p
d8b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
d8c0: 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20  cells (which is 
d8d0: 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73  only.    ** poss
d8e0: 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
d8f0: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
d900: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
d910: 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
d920: 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f      ** offset to
d930: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
d940: 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61  t area will equa
d950: 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  l the page size 
d960: 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a  minus the.    **
d970: 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76   bytes of reserv
d980: 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20  ed space. */.   
d990: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d9a0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d  nCell>0 || top==
d9b0: 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f  usableSize || CO
d9c0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20  RRUPT_DB );..   
d9d0: 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
d9e0: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
d9f0: 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
da00: 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
da10: 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65  d.    ** of page
da20: 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20   when parsing a 
da30: 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20  cell.  .    **. 
da40: 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     ** The follow
da50: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ing block of cod
da60: 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74  e checks early t
da70: 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20  o see if a cell 
da80: 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70  extends.    ** p
da90: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
daa0: 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
dab0: 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
dac0: 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
dad0: 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20      ** returned 
dae0: 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20  if it does..    
daf0: 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73  */.    iCellFirs
db00: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
db10: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
db20: 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  .    iCellLast =
db30: 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
db40: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
db50: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
db60: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
db70: 20 20 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20      {.      int 
db80: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
db90: 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
dba0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
dbb0: 61 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ay */.      int 
dbc0: 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
dbd0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
dbe0: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70  */..      if( !p
dbf0: 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
dc00: 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20  llLast--;.      
dc10: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
dc20: 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  ->nCell; i++){. 
dc30: 20 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32         pc = get2
dc40: 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f  byte(&data[cellO
dc50: 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  ffset+i*2]);.   
dc60: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dc70: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
dc80: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
dc90: 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
dca0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dcb0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
dcc0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
dcd0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
dce0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
dcf0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
dd00: 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65  .        sz = ce
dd10: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
dd20: 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
dd30: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
dd40: 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65  c+sz==usableSize
dd50: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
dd60: 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
dd70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
dd80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dd90: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
dda0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ddb0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
ddc0: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b  af ) iCellLast++
ddd0: 3b 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64 69 66  ;.    }  .#endif
dde0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ddf0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
de00: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
de10: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
de20: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
de30: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
de40: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
de50: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
de60: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
de70: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
de80: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
de90: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
dea0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
deb0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
dec0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
ded0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
dee0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
def0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
df00: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
df10: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
df20: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
df30: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
df40: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
df50: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
df60: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
df70: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
df80: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
df90: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
dfa0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
dfb0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
dfc0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
dfd0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
dfe0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
dff0: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
e000: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
e010: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
e020: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
e030: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
e040: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
e050: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
e060: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
e070: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e080: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
e090: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
e0a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
e0b0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
e0c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
e0d0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
e0e0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
e0f0: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
e100: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
e110: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
e120: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
e130: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
e140: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
e150: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
e160: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
e170: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
e180: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
e190: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
e1a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e1b0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
e1c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
e1d0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
e1e0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
e1f0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
e200: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
e210: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
e220: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
e230: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
e240: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
e250: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
e260: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
e270: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
e280: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
e290: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
e2a0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
e2b0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
e2c0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
e2d0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
e2e0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
e2f0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
e300: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
e310: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
e320: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
e330: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
e340: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
e350: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
e360: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
e370: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
e380: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
e390: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
e3a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
e3b0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
e3c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e3d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e3e0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
e3f0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
e400: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
e410: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
e420: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
e430: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
e440: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
e450: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
e460: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
e470: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
e480: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
e490: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
e4a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
e4b0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
e4c0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
e4d0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
e4e0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
e4f0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
e500: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
e510: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
e520: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
e530: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
e540: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e550: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
e560: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
e570: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
e580: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e590: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e5a0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e5b0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
e5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e5d0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e5e0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e5f0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
e600: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
e610: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
e620: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
e630: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e640: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
e650: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e660: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
e670: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
e680: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
e690: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
e6a0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
e6b0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
e6c0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
e6d0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
e6e0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
e6f0: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
e700: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
e710: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
e720: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
e730: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
e740: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
e750: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
e760: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
e770: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
e780: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
e790: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
e7a0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
e7b0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
e7c0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
e7d0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
e7e0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
e7f0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
e800: 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
e810: 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
e820: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
e830: 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
e840: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
e850: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
e860: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
e870: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
e880: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
e890: 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
e8a0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
e8b0: 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
e8c0: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
e8d0: 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
e8e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
e8f0: 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
e900: 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
e910: 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
e920: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
e930: 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
e940: 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
e950: 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
e960: 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
e970: 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
e980: 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
e990: 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
e9a0: 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
e9b0: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  );.  pPage->aDat
e9c0: 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  a = sqlite3Pager
e9d0: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
e9e0: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61  ;.  pPage->pDbPa
e9f0: 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
ea00: 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74  pPage->pBt = pBt
ea10: 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ;.  pPage->pgno 
ea20: 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d  = pgno;.  pPage-
ea30: 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61  >hdrOffset = pPa
ea40: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
ea50: 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  0 : 0;.  return 
ea60: 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage; .}../*.**
ea70: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
ea80: 20 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69   the pager.  Ini
ea90: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
eaa0: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
eab0: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
eac0: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ead0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f  .**.** If the no
eae0: 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20  Content flag is 
eaf0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
eb00: 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
eb10: 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63  e about.** the c
eb20: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
eb30: 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ge at this time.
eb40: 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74    So do not go t
eb50: 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f  o the disk.** to
eb60: 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65   fetch the conte
eb70: 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  nt.  Just fill i
eb80: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69  n the content wi
eb90: 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77  th zeros for now
eba0: 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66  ..** If in the f
ebb0: 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71  uture we call sq
ebc0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
ebd0: 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20  ) on this page, 
ebe0: 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65  that.** means we
ebf0: 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74 6f   have started to
ec00: 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62   be concerned ab
ec10: 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  out content and 
ec20: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  the disk.** read
ec30: 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74   should occur at
ec40: 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a   that point..*/.
ec50: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
ec60: 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  GetPage(.  BtSha
ec70: 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
ec80: 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
ec90: 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
eca0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ecb0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
ecc0: 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61  fetch */.  MemPa
ecd0: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
ece0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  /* Return the pa
ecf0: 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d  ge in this param
ed00: 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  eter */.  int fl
ed10: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
ed20: 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  * PAGER_GET_NOCO
ed30: 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47  NTENT or PAGER_G
ed40: 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29  ET_READONLY */.)
ed50: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
ed60: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
ed70: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
ed80: 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  =0 || flags==PAG
ed90: 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
eda0: 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
edb0: 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b  _GET_READONLY );
edc0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
edd0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
ede0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
edf0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
ee00: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
ee10: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
ee20: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66  ge**)&pDbPage, f
ee30: 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20  lags);.  if( rc 
ee40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a  ) return rc;.  *
ee50: 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61  ppPage = btreePa
ee60: 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
ee70: 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
ee80: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
ee90: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
eea0: 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66  etrieve a page f
eeb0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61  rom the pager ca
eec0: 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75  che. If the requ
eed0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
eee0: 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20  t.** already in 
eef0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
ef00: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69  return NULL. Ini
ef10: 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50  tialize the MemP
ef20: 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d  age.pBt and.** M
ef30: 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65  emPage.aData ele
ef40: 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e  ments if needed.
ef50: 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
ef60: 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f  ge *btreePageLoo
ef70: 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  kup(BtShared *pB
ef80: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
ef90: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
efa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
efb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
efc0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
efd0: 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
efe0: 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
eff0: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
f000: 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
f010: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
f020: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
f030: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
f040: 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pBt);.  }.  retu
f050: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
f060: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
f070: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
f080: 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66  ile in pages. If
f090: 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
f0a0: 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20  nd of.** error, 
f0b0: 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65  return ((unsigne
f0c0: 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74  d int)-1)..*/.st
f0d0: 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50  atic Pgno btreeP
f0e0: 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65  agecount(BtShare
f0f0: 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72  d *pBt){.  retur
f100: 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  n pBt->nPage;.}.
f110: 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65  u32 sqlite3Btree
f120: 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a  LastPage(Btree *
f130: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
f140: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
f150: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
f160: 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e  ert( ((p->pBt->n
f170: 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29  Page)&0x8000000)
f180: 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
f190: 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
f1a0: 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
f1b0: 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
f1c0: 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
f1d0: 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54  nitialize it.  T
f1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a  his routine is j
f1f0: 75 73 74 20 61 0a 2a 2a 20 63 6f 6e 76 65 6e 69  ust a.** conveni
f200: 65 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f  ence wrapper aro
f210: 75 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c  und separate cal
f220: 6c 73 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ls to btreeGetPa
f230: 67 65 28 29 20 61 6e 64 20 0a 2a 2a 20 62 74 72  ge() and .** btr
f240: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a  eeInitPage()..**
f250: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
f260: 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
f270: 20 76 61 6c 75 65 20 2a 70 70 50 61 67 65 20 69   value *ppPage i
f280: 73 20 73 65 74 20 74 6f 20 69 73 20 75 6e 64 65  s set to is unde
f290: 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79  fined. It.** may
f2a0: 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65   remain unchange
f2b0: 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20  d, or it may be 
f2c0: 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  set to an invali
f2d0: 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  d value..*/.stat
f2e0: 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69  ic int getAndIni
f2f0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
f300: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
f310: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
f320: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
f330: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f360: 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74 20  the page to get 
f370: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
f380: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
f390: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
f3a0: 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68  e page pointer h
f3b0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ere */.  int bRe
f3c0: 61 64 6f 6e 6c 79 20 20 20 20 20 20 20 20 20 20  adonly          
f3d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
f3e0: 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 6f  R_GET_READONLY o
f3f0: 72 20 30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  r 0 */.){.  int 
f400: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
f410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
f430: 20 20 61 73 73 65 72 74 28 20 62 52 65 61 64 6f    assert( bReado
f440: 6e 6c 79 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  nly==PAGER_GET_R
f450: 45 41 44 4f 4e 4c 59 20 7c 7c 20 62 52 65 61 64  EADONLY || bRead
f460: 6f 6e 6c 79 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  only==0 );..  if
f470: 28 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  ( pgno>btreePage
f480: 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
f490: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
f4a0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
f4b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  lse{.    rc = bt
f4c0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
f4d0: 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 52  pgno, ppPage, bR
f4e0: 65 61 64 6f 6e 6c 79 29 3b 0a 20 20 20 20 69 66  eadonly);.    if
f4f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f500: 26 26 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  && (*ppPage)->is
f510: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
f520: 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
f530: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
f540: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
f550: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
f560: 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
f570: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
f580: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 74 65 73 74     }.  }..  test
f590: 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
f5a0: 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
f5b0: 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
f5c0: 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
f5d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f5e0: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
f5f0: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
f600: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
f610: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
f620: 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
f630: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
f640: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
f650: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
f660: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
f670: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
f680: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f690: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f6a0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
f6b0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
f6c0: 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
f6d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
f6e0: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
f6f0: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
f700: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
f710: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
f720: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
f730: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
f740: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
f750: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
f760: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
f770: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
f780: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
f790: 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
f7a0: 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
f7b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
f7c0: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
f7d0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
f7e0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
f7f0: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
f800: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
f810: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
f820: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f830: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
f840: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
f850: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
f860: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
f870: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
f880: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
f890: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f8a0: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
f8b0: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
f8c0: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
f8d0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
f8e0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
f8f0: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
f900: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
f910: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
f920: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
f930: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
f940: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
f950: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
f960: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
f970: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f980: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
f990: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
f9a0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
f9b0: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
f9c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
f9d0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
f9e0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
f9f0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
fa00: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
fa10: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
fa20: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
fa30: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
fa40: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
fa50: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
fa60: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
fa70: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
fa80: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
fa90: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
faa0: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
fab0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
fac0: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
fad0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
fae0: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
faf0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
fb00: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
fb10: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
fb20: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
fb30: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
fb40: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
fb50: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
fb60: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
fb70: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
fb80: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
fb90: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
fba0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
fbb0: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
fbc0: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
fbd0: 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
fbe0: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
fbf0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
fc00: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
fc10: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
fc20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
fc30: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
fc40: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
fc50: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
fc60: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
fc70: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
fc80: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
fc90: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fca0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
fcb0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
fcc0: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
fcd0: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
fce0: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
fcf0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
fd00: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
fd10: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
fd20: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
fd30: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fd40: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
fd50: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
fd60: 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
fd70: 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
fd80: 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
fd90: 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
fda0: 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
fdb0: 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
fdc0: 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
fdd0: 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
fde0: 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
fdf0: 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
fe00: 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
fe10: 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
fe20: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
fe30: 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
fe40: 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
fe50: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
fe60: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
fe70: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
fe80: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
fe90: 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
fea0: 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
feb0: 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
fec0: 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
fed0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
fee0: 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
fef0: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
ff00: 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
ff10: 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
ff20: 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
ff30: 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
ff40: 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
ff50: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
ff60: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
ff70: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
ff80: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
ff90: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
ffa0: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
ffb0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
ffc0: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
ffd0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
ffe0: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
fff0: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
10000 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
10010 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
10020 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
10030 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
10040 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
10050 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
10060 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
10070 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
10080 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
10090 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
100a0 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
100b0 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
100c0 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
100d0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
100e0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
100f0 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
10100 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
10110 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
10120 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
10130 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
10140 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
10150 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
10160 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
10170 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
10180 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
10190 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
101a0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
101b0 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
101c0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
101d0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
101e0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
101f0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
10200 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
10210 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
10220 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
10230 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
10240 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
10250 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
10260 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
10270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
10280 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
10290 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
102a0 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
102b0 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
102c0 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
102d0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
102e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
102f0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
10300 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
10310 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
10320 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
10330 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
10340 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
10350 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
10360 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
10370 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
10380 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
10390 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
103a0 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
103b0 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
103c0 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
103d0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
103e0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
103f0 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
10400 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
10410 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
10420 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
10430 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
10440 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
10450 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
10460 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
10470 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
10480 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
10490 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
104a0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
104b0 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
104c0 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
104d0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
104e0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
104f0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
10500 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
10510 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10520 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
10530 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
10540 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
10550 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
10560 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
10570 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
10580 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
10590 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
105a0 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
105b0 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
105c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
105d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
105e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
105f0 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
10600 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
10610 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
10620 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
10630 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
10640 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
10650 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
10660 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
10670 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
10680 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
10690 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
106a0 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
106b0 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
106c0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
106d0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
106e0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
106f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
10700 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
10710 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
10720 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
10730 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
10740 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
10750 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
10760 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
10770 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
10780 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
10790 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
107a0 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
107b0 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
107c0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
107d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
107e0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
107f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
10800 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
10810 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
10820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10830 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
10840 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
10850 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
10860 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
10870 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
10880 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
10890 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
108a0 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
108b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
108c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
108d0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
108e0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
108f0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
10900 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
10910 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
10920 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
10930 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
10940 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
10950 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
10960 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
10970 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
10980 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
10990 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
109a0 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
109b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
109c0 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
109d0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
109e0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
109f0 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
10a00 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
10a10 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
10a20 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
10a30 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
10a40 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
10a50 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
10a60 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
10a70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
10a80 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
10a90 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
10aa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
10ab0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
10ac0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
10ad0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
10ae0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10af0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
10b00 20 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64        if( isMemd
10b10 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  b ){.        mem
10b20 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cpy(zFullPathnam
10b30 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71  e, zFilename, sq
10b40 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
10b50 69 6c 65 6e 61 6d 65 29 2b 31 29 3b 0a 20 20 20  ilename)+1);.   
10b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10b80 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66  FullPathname(pVf
10b90 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  s, zFilename,.  
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bc0 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20   nFullPathname, 
10bd0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
10be0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
10bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10c00 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
10c10 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
10c20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10c30 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
10c40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10c50 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53   }.      }.#if S
10c60 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
10c70 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
10c80 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
10c90 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
10ca0 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
10cb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
10cc0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
10cd0 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
10ce0 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
10cf0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
10d00 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
10d10 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
10d20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
10d30 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
10d40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f  .#endif.      fo
10d50 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53  r(pBt=GLOBAL(BtS
10d60 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
10d70 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20  aredCacheList); 
10d80 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e  pBt; pBt=pBt->pN
10d90 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ext){.        as
10da0 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e  sert( pBt->nRef>
10db0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
10dc0 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c   0==strcmp(zFull
10dd0 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Pathname, sqlite
10de0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70  3PagerFilename(p
10df0 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a  Bt->pPager, 0)).
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e10 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
10e20 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
10e30 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
10e40 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
10e50 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
10e60 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
10e70 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
10e80 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
10e90 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
10ea0 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
10eb0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
10ec0 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
10ed0 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10ef0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10f00 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10f20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
10f30 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
10f40 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
10f50 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
10f60 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
10f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
10f80 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
10f90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10fa0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
10fb0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10fd0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
10fe0 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
10ff0 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
11000 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
11010 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
11020 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
11030 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
11040 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11050 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
11060 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
11070 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
11080 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
11090 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
110a0 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
110b0 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
110c0 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
110d0 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
110e0 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
110f0 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
11100 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
11110 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
11120 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
11130 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
11140 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
11150 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
11160 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
11170 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
11180 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
11190 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
111a0 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
111b0 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
111c0 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
111d0 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
111e0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
111f0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
11200 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
11210 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
11220 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
11230 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
11240 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
11250 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
11260 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
11270 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
11280 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
11290 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
112a0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
112b0 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
112c0 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
112d0 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
112e0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
112f0 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
11300 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
11310 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
11320 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
11330 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
11340 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
11350 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
11360 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
11370 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
11380 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
11390 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
113a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
113b0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
113c0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
113d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
113e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
113f0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
11400 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
11410 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
11430 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
11440 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67 65  , vfsFlags, page
11450 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66 28  Reinit);.    if(
11460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11470 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
11480 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
11490 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64 62  (pBt->pPager, db
114a0 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20  ->szMmap);.     
114b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
114c0 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
114d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
114e0 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
114f0 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
11500 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11520 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
11530 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  out;.    }.    p
11540 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  Bt->openFlags = 
11550 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20 70  (u8)flags;.    p
11560 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20  Bt->db = db;.   
11570 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
11580 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d  Busyhandler(pBt-
11590 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e  >pPager, btreeIn
115a0 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c  vokeBusyHandler,
115b0 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42   pBt);.    p->pB
115c0 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
115d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
115e0 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
115f0 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  1 = 0;.    if( s
11600 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
11610 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
11620 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  r) ) pBt->btsFla
11630 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
11640 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  NLY;.#ifdef SQLI
11650 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
11660 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
11670 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45  gs |= BTS_SECURE
11680 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a  _DELETE;.#endif.
11690 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
116a0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
116b0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
116c0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
116d0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
116e0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
116f0 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
11700 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
11710 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
11720 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
11730 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
11740 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11750 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
11760 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
11770 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
11780 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
11790 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
117a0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
117b0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
117c0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
117d0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
117e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
117f0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
11800 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
11810 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
11820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11830 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
11840 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
11850 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
11860 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
11870 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
11880 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
11890 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
118a0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
118b0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
118c0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
118d0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
118e0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
118f0 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
11900 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
11910 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
11920 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
11930 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
11940 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
11950 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
11960 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
11970 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
11980 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
11990 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
119a0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
119b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
119c0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
119d0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
119e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
119f0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
11a00 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
11a10 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
11a20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
11a30 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
11a40 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
11a50 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
11a60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
11a70 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
11a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
11a90 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11aa0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
11ab0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
11ac0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
11ad0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
11ae0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
11af0 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
11b00 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
11b10 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
11b20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
11b30 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
11b40 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
11b50 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
11b60 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
11b70 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
11b80 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
11b90 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
11ba0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
11bb0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
11bc0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
11bd0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
11be0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
11bf0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
11c00 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
11c10 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
11c20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
11c30 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
11c40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
11c50 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
11c60 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
11c70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
11c80 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
11c90 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
11ca0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
11cb0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
11cc0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
11cd0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
11ce0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
11cf0 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
11d00 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
11d10 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
11d20 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
11d30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
11d40 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
11d50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11d60 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
11d70 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
11d80 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
11d90 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
11da0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
11db0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
11dc0 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
11dd0 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c  ){.      MUTEX_L
11de0 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
11df0 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
11e00 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ; ).      pBt->n
11e10 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d  Ref = 1;.      M
11e20 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65  UTEX_LOGIC( mute
11e30 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
11e40 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
11e50 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
11e60 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20  MASTER);).      
11e70 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
11e80 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
11e90 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
11ea0 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
11eb0 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20     pBt->mutex = 
11ec0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
11ed0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
11ee0 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  AST);.        if
11ef0 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20  ( pBt->mutex==0 
11f00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
11f10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
11f20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61            db->ma
11f30 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
11f40 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
11f50 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
11f60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11f70 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
11f80 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
11f90 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70  Shared);.      p
11fa0 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42  Bt->pNext = GLOB
11fb0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
11fc0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
11fd0 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42  ist);.      GLOB
11fe0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
11ff0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
12000 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20  ist) = pBt;.    
12010 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12020 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
12030 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  d);.    }.#endif
12040 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  .  }..#if !defin
12050 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
12060 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
12070 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
12080 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
12090 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72  * If the new Btr
120a0 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62  ee uses a sharab
120b0 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68  le pBtShared, th
120c0 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a  en link the new.
120d0 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20    ** Btree into 
120e0 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  the list of all 
120f0 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20  sharable Btrees 
12100 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  for the same con
12110 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  nection..  ** Th
12120 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69  e list is kept i
12130 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
12140 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73  r by pBt address
12150 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12160 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
12170 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65  int i;.    Btree
12180 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28   *pSib;.    for(
12190 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
121a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
121b0 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b  (pSib = db->aDb[
121c0 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53  i].pBt)!=0 && pS
121d0 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a  ib->sharable ){.
121e0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
121f0 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53  Sib->pPrev ){ pS
12200 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76  ib = pSib->pPrev
12210 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
12220 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42 74  p->pBt<pSib->pBt
12230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
12240 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20  >pNext = pSib;. 
12250 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
12260 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
12270 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70   pSib->pPrev = p
12280 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12290 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
122a0 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26  ( pSib->pNext &&
122b0 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42   pSib->pNext->pB
122c0 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  t<p->pBt ){.    
122d0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
122e0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
122f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12300 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
12310 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
12320 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
12330 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
12340 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
12350 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
12360 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
12370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12380 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
12390 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
123a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
123b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
123c0 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
123d0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
123e0 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
123f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12400 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
12410 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
12420 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
12430 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
12440 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
12450 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
12460 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
12470 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74  ee(p);.    *ppBt
12480 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
12490 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
124a0 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
124b0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
124c0 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
124d0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
124e0 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
124f0 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
12500 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
12510 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
12520 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
12530 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
12540 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
12550 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
12560 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
12570 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
12580 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
12590 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
125a0 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
125b0 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
125c0 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
125d0 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ZE);.    }.  }. 
125e0 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29   if( mutexOpen )
125f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
12600 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12610 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20  (mutexOpen) );. 
12620 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
12630 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
12640 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12650 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
12660 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
12670 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
12680 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
12690 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
126a0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
126b0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
126c0 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
126d0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
126e0 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
126f0 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
12700 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
12710 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
12720 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
12730 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
12740 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
12750 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
12760 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
12770 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12780 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
12790 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
127a0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
127b0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
127c0 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
127d0 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
127e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
127f0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
12800 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
12810 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
12820 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
12830 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
12840 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
12850 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
12860 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
12870 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
12880 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
12890 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
128a0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
128b0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
128c0 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
128d0 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
128e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
128f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12900 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
12910 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12920 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
12930 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
12940 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
12950 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
12960 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
12970 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
12980 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
12990 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
129a0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
129b0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
129c0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
129d0 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
129e0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
129f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
12a00 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
12a10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12a20 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
12a30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
12a40 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
12a50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
12a60 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
12a70 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
12a80 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
12a90 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
12aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
12ab0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
12ac0 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
12ad0 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
12ae0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
12af0 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
12b00 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
12b10 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
12b20 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
12b30 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
12b40 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
12b50 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
12b60 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
12b70 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
12b80 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
12b90 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
12ba0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
12bb0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
12bc0 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
12bd0 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
12be0 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
12bf0 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
12c00 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
12c10 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
12c20 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
12c30 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
12c40 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
12c50 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
12c60 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
12c70 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
12c80 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
12c90 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
12ca0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
12cb0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
12cc0 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
12cd0 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
12ce0 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
12cf0 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
12d00 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
12d10 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
12d20 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
12d30 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
12d40 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
12d50 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
12d60 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
12d70 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
12d80 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
12d90 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
12da0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
12db0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
12dc0 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
12dd0 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
12de0 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
12df0 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
12e00 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
12e10 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
12e20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
12e30 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
12e40 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
12e50 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12e60 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
12e70 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
12e80 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
12e90 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
12ea0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
12eb0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
12ec0 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
12ed0 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
12ee0 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
12ef0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
12f00 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
12f10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
12f20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
12f30 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
12f40 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
12f50 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
12f60 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
12f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
12f80 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
12f90 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
12fa0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
12fb0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
12fc0 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
12fd0 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
12fe0 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
12ff0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
13000 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
13010 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
13020 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
13030 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
13040 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
13050 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
13060 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
13070 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
13080 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
13090 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
130a0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
130b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
130c0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
130d0 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
130e0 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
130f0 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
13100 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
13110 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
13120 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
13130 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
13140 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
13150 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
13160 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
13170 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
13180 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
13190 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
131a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
131b0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
131c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
131d0 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
131e0 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
131f0 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
13200 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
13210 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
13220 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
13230 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
13240 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
13250 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
13260 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
13270 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
13280 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
13290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
132a0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
132b0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
132c0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
132d0 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
132e0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
132f0 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
13300 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
13310 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
13320 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
13330 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
13340 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
13350 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
13360 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
13370 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
13380 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
13390 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
133a0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
133b0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
133c0 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
133d0 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
133e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
133f0 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
13400 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
13410 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
13420 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
13430 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
13440 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
13450 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
13460 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
13470 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
13480 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
13490 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
134a0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
134b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
134c0 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
134d0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78  ;.    if( pBt->x
134e0 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42  FreeSchema && pB
134f0 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  t->pSchema ){.  
13500 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63      pBt->xFreeSc
13510 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d  hema(pBt->pSchem
13520 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  a);.    }.    sq
13530 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70  lite3DbFree(0, p
13540 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
13550 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
13560 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
13570 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
13580 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13590 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
135a0 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
135b0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
135c0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
135d0 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
135e0 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
135f0 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
13600 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
13610 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
13620 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
13630 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
13640 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13650 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13660 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
13670 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
13680 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
13690 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
136a0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
136b0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
136c0 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
136d0 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
136e0 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
136f0 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
13700 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
13710 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
13720 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
13730 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
13740 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
13750 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
13760 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
13770 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
13780 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
13790 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
137a0 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
137b0 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
137c0 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
137d0 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
137e0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
137f0 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
13800 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
13810 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
13820 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
13830 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
13840 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
13850 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
13860 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
13870 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
13880 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
13890 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
138a0 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
138b0 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
138c0 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
138d0 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
138e0 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
138f0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
13900 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
13910 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
13920 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
13930 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
13940 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
13950 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
13960 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13970 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
13980 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
13990 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
139a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
139b0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
139c0 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
139d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
139e0 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
139f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13a00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13a10 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
13a20 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
13a30 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
13a40 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
13a50 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
13a60 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
13a70 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
13a80 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
13a90 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
13aa0 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
13ab0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
13ac0 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
13ad0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13ae0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
13af0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13b00 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
13b10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13b20 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
13b30 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
13b40 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
13b50 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
13b60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13b70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13b80 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
13b90 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
13ba0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
13bb0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
13bc0 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
13bd0 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
13be0 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
13bf0 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
13c00 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
13c10 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
13c20 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
13c30 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
13c40 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
13c50 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
13c60 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
13c70 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
13c80 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
13c90 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
13ca0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
13cb0 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
13cc0 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
13cd0 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
13ce0 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
13cf0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
13d00 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
13d10 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
13d20 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
13d30 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
13d40 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
13d50 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
13d60 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
13d70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
13d80 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
13d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
13da0 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
13db0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
13dc0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
13dd0 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
13de0 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
13df0 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
13e00 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
13e10 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
13e20 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
13e30 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13e40 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13e50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13e60 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
13e70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
13e80 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
13e90 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
13ea0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
13eb0 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
13ec0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
13ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13ee0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
13ef0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
13f00 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65   the given btree
13f10 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74   is set to safet
13f20 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f  y level 1.  In o
13f30 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72  ther.** words, r
13f40 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f  eturn TRUE if no
13f50 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f   sync() occurs o
13f60 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73  n the disk files
13f70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13f80 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65  BtreeSyncDisable
13f90 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  d(Btree *p){.  B
13fa0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13fb0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ->pBt;.  int rc;
13fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13fd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
13fe0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20  >db->mutex) );  
13ff0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14000 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
14010 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  t( pBt && pBt->p
14020 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20  Pager );.  rc = 
14030 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
14040 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nc(pBt->pPager);
14050 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14060 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14070 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
14080 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
14090 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
140a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
140b0 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
140c0 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
140d0 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
140e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
140f0 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
14100 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
14110 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
14120 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
14130 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
14140 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
14150 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
14160 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
14170 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
14180 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
14190 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
141a0 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
141b0 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
141c0 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
141d0 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
141e0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
141f0 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
14200 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
14210 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
14220 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
14230 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
14240 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
14250 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
14260 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
14270 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
14280 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
14290 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
142a0 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
142b0 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
142c0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
142d0 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
142e0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
142f0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
14300 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
14310 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
14320 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
14330 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
14340 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
14350 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
14360 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
14370 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
14380 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
14390 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
143a0 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
143b0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
143c0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
143d0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
143e0 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
143f0 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
14400 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
14410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
14420 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14430 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
14440 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
14450 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
14460 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14470 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
14480 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
14490 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
144a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
144b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
144c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
144d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
144e0 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
144f0 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
14500 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
14510 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
14520 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
14530 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
14540 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
14550 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
14560 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
14570 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
14580 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
14590 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
145a0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
145b0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
145c0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
145d0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
145e0 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
145f0 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
14600 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
14610 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
14620 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
14630 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
14640 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
14650 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
14660 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
14670 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
14680 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
14690 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
146a0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
146b0 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
146c0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
146d0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
146e0 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
146f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
14700 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14710 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
14720 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
14730 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
14740 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
14750 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
14760 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
14770 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
14780 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
14790 28 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45  (SQLITE_HAS_CODE
147a0 43 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  C) || defined(SQ
147b0 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
147c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
147d0 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
147e0 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
147f0 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
14800 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
14810 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
14820 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
14830 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
14840 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
14850 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
14860 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
14870 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
14880 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
14890 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
148a0 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
148b0 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
148c0 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
148d0 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
148e0 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
148f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
14900 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
14910 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
14920 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
14930 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
14940 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
14950 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
14960 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
14970 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
14980 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
14990 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
149a0 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
149b0 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
149c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
149d0 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
149e0 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  x(Btree *p){.  a
149f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
14a00 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
14a10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
14a20 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
14a30 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
14a40 75 73 61 62 6c 65 53 69 7a 65 3b 0a 7d 0a 23 65  usableSize;.}.#e
14a50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 48  ndif /* SQLITE_H
14a60 41 53 5f 43 4f 44 45 43 20 7c 7c 20 53 51 4c 49  AS_CODEC || SQLI
14a70 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
14a80 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
14a90 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
14aa0 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
14ab0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
14ac0 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  UUM)./*.** Retur
14ad0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14ae0 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
14af0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
14b00 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
14b10 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
14b20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
14b30 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
14b40 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
14b50 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
14b60 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
14b70 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
14b80 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
14b90 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
14ba0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
14bb0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14bc0 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
14bd0 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
14be0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c  sableSize;.  sql
14bf0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14c00 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
14c10 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
14c20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
14c30 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
14c40 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
14c50 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
14c60 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
14c70 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
14c80 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
14c90 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
14ca0 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
14cb0 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
14cc0 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
14cd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
14ce0 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
14cf0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
14d00 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
14d10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14d20 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
14d30 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
14d40 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
14d50 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
14d60 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14d70 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14d80 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
14d90 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  t the BTS_SECURE
14da0 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66 20  _DELETE flag if 
14db0 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72 20  newFlag is 0 or 
14dc0 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20 69  1.  If newFlag i
14dd0 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61  s -1,.** then ma
14de0 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20 20  ke no changes.  
14df0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74 68  Always return th
14e00 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 42  e value of the B
14e10 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
14e20 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74 65  .** setting afte
14e30 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a 2f  r the change..*/
14e40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14e50 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
14e60 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
14e70 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
14e80 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
14e90 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
14ea0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14eb0 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
14ec0 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
14ed0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 53  sFlags &= ~BTS_S
14ee0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
14ef0 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20    if( newFlag ) 
14f00 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
14f10 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
14f20 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62 20  ELETE;.  } .  b 
14f30 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  = (p->pBt->btsFl
14f40 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
14f50 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20 73  _DELETE)!=0;.  s
14f60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
14f70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 3b  (p);.  return b;
14f80 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
14f90 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14fa0 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
14fb0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
14fc0 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
14fd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
14fe0 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
14ff0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
15000 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
15010 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
15020 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
15030 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
15040 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
15050 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
15060 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
15070 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
15080 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
15090 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
150a0 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
150b0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
150c0 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
150d0 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
150e0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
150f0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
15100 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
15110 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
15120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
15130 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
15140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
15150 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
15160 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15170 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
15180 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
15190 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
151a0 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
151b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
151c0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
151d0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
151e0 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
151f0 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
15200 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
15210 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
15220 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
15230 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
15240 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
15250 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
15260 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
15270 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
15280 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15290 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
152a0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
152b0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
152c0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
152d0 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
152e0 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
152f0 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
15300 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
15310 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
15320 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
15330 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
15340 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
15350 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
15360 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
15370 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
15380 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
15390 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
153a0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
153b0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
153c0 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
153d0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
153e0 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
153f0 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
15400 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
15410 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
15420 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
15430 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15440 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15450 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
15460 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
15470 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
15480 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
15490 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
154a0 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
154b0 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
154c0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
154d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
154e0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
154f0 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
15500 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
15510 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
15520 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
15530 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
15540 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
15550 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
15560 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
15570 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
15580 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
15590 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
155a0 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
155b0 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
155c0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
155d0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
155e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
155f0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
15600 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
15610 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  tions */.  MemPa
15620 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
15630 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65  /* Page 1 of the
15640 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
15650 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
15660 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15670 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
15680 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
15690 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d   int nPageFile =
156a0 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
156b0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
156c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
156d0 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64  .  int nPageHead
156e0 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  er;     /* Numbe
156f0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
15700 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72  e database accor
15710 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a  ding to hdr */..
15720 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15730 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
15740 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
15750 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
15760 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  1==0 );.  rc = s
15770 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
15780 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  dLock(pBt->pPage
15790 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
157a0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
157b0 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65   rc;.  rc = btre
157c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
157d0 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
157e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
157f0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
15800 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
15810 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
15820 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
15830 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
15840 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
15850 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
15860 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50   */.  nPage = nP
15870 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34  ageHeader = get4
15880 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
15890 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73  ge1->aData);.  s
158a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
158b0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
158c0 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20  , &nPageFile);. 
158d0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c   if( nPage==0 ||
158e0 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29   memcmp(24+(u8*)
158f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39  pPage1->aData, 9
15900 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  2+(u8*)pPage1->a
15910 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20  Data,4)!=0 ){.  
15920 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46    nPage = nPageF
15930 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ile;.  }.  if( n
15940 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
15950 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
15960 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
15970 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
15980 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
15990 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
159a0 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
159b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
159c0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
159d0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
159e0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
159f0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
15a00 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
15a10 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
15a20 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
15a30 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
15a40 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
15a50 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
15a60 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
15a70 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
15a80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
15a90 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
15aa0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
15ab0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
15ac0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
15ad0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
15ae0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15af0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
15b00 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
15b10 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
15b20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
15b30 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
15b40 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
15b50 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
15b60 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
15b70 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
15b80 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
15b90 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
15ba0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
15bb0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
15bc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15bd0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
15be0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
15bf0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
15c00 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
15c10 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
15c20 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
15c30 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
15c40 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
15c50 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
15c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
15c70 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
15c80 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
15c90 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
15ca0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
15cb0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
15cc0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
15cd0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
15ce0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
15cf0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
15d00 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
15d10 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
15d20 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
15d30 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
15d40 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
15d50 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
15d60 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
15d70 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
15d80 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
15d90 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
15da0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
15db0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
15dc0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
15dd0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
15de0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15df0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
15e00 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
15e10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
15e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15e30 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
15e40 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
15e50 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
15e60 65 6e 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20  en==0 ){.#ifdef 
15e70 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
15e80 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 0a 20  AL_SAFETYLEVEL. 
15e90 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
15ea0 74 20 74 6f 20 73 70 65 63 69 66 69 65 64 20 73  t to specified s
15eb0 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20  afety_level for 
15ec0 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  WAL mode */.    
15ed0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62 21      if( pBt->db!
15ee0 3d 30 20 26 26 20 70 42 74 2d 3e 64 62 2d 3e 61  =0 && pBt->db->a
15ef0 44 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Db!=0 ){.       
15f00 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
15f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
15f20 62 20 3d 20 70 42 74 2d 3e 64 62 3b 0a 20 20 20  b = pBt->db;.   
15f30 20 20 20 20 20 20 20 44 62 20 2a 61 44 62 20 3d         Db *aDb =
15f40 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20 20 20 20   db->aDb;.      
15f50 20 20 20 20 75 38 20 6c 65 76 65 6c 20 3d 20 30      u8 level = 0
15f60 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
15f70 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e  iDb=0; iDb<db->n
15f80 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  Db; iDb++){.    
15f90 20 20 20 20 20 20 20 20 69 66 28 20 61 44 62 5b          if( aDb[
15fa0 69 44 62 5d 2e 70 42 74 20 26 26 20 61 44 62 5b  iDb].pBt && aDb[
15fb0 69 44 62 5d 2e 70 42 74 2d 3e 70 42 74 3d 3d 70  iDb].pBt->pBt==p
15fc0 42 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  Bt ) break;.    
15fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15fe0 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
15ff0 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 20  ->nDb );.       
16000 20 20 20 6c 65 76 65 6c 20 3d 20 64 62 2d 3e 61     level = db->a
16010 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c  Db[iDb].safety_l
16020 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  evel;.          
16030 69 66 28 20 21 53 51 4c 49 54 45 5f 44 62 53 61  if( !SQLITE_DbSa
16040 66 65 74 79 4c 65 76 65 6c 49 73 46 69 78 65 64  fetyLevelIsFixed
16050 28 6c 65 76 65 6c 29 20 26 26 20 0a 20 20 20 20  (level) && .    
16060 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
16070 5f 44 62 53 61 66 65 74 79 4c 65 76 65 6c 56 61  _DbSafetyLevelVa
16080 6c 75 65 28 6c 65 76 65 6c 29 20 21 3d 20 53 51  lue(level) != SQ
16090 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
160a0 5f 53 41 46 45 54 59 4c 45 56 45 4c 29 20 29 7b  _SAFETYLEVEL) ){
160b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 44 62  .            aDb
160c0 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f 6c 65 76  [iDb].safety_lev
160d0 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  el = SQLITE_DEFA
160e0 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45  ULT_WAL_SAFETYLE
160f0 56 45 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  VEL;.           
16100 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16110 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d  SafetyLevel(pBt-
16120 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
16130 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45  DEFAULT_WAL_SAFE
16140 54 59 4c 45 56 45 4c 2c 20 0a 20 20 20 20 20 20  TYLEVEL, .      
16150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
16180 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30  TE_FullFSync)!=0
16190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 20 20 20 20 20 28 64 62 2d 3e 66 6c           (db->fl
161c0 61 67 73 26 53 51 4c 49 54 45 5f 43 6b 70 74 46  ags&SQLITE_CkptF
161d0 75 6c 6c 46 53 79 6e 63 29 21 3d 30 29 3b 0a 20  ullFSync)!=0);. 
161e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
161f0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
16200 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
16210 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
16220 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16230 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
16240 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
16250 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ADB;.    }.#endi
16260 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
16270 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
16280 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
16290 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
162a0 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
162b0 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
162c0 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
162d0 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
162e0 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
162f0 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
16300 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
16310 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
16320 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
16330 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
16340 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
16350 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
16360 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
16370 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
16380 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
16390 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
163a0 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
163b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
163c0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
163d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
163e0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
163f0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
16400 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
16410 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
16420 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
16430 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
16440 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
16450 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
16460 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
16470 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
16480 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
16490 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
164a0 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
164b0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
164c0 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
164d0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
164e0 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
164f0 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
16500 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
16510 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
16520 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
16530 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
16540 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
16550 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
16560 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
16570 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
16580 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
16590 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
165a0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
165b0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
165c0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
165d0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
165e0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
165f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
16600 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
16610 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
16620 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
16630 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
16640 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
16650 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
16660 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
16670 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
16680 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
16690 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
166a0 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
166b0 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
166c0 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
166d0 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
166e0 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
166f0 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
16700 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
16710 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
16720 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
16730 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
16740 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
16750 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16760 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
16770 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
16780 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
16790 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
167a0 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
167b0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
167c0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
167d0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
167e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
167f0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
16800 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
16810 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
16820 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
16830 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
16840 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
16850 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
16860 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
16870 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
16880 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
16890 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
168a0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
168b0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
168c0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
168d0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
168e0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
168f0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
16900 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
16910 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
16920 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
16930 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
16940 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
16950 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
16960 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
16970 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
16980 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
16990 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
169a0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
169b0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
169c0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169e0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
169f0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
16a00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
16a10 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
16a20 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
16a30 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
16a40 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
16a50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
16a60 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
16a70 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
16a80 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
16a90 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
16aa0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
16ab0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32  ENCE-OF: R-28312
16ac0 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20  -64704 However, 
16ad0 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20  the usable size 
16ae0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
16af0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73  o.    ** be less
16b00 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74   than 480. In ot
16b10 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
16b20 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35  e page size is 5
16b30 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  12, then the.   
16b40 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61   ** reserved spa
16b50 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65  ce size cannot e
16b60 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20  xceed 32. */.   
16b70 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
16b80 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
16b90 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
16ba0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
16bb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
16bc0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
16bd0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
16be0 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
16bf0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
16c00 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
16c10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
16c20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
16c30 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
16c40 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
16c50 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
16c60 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
16c70 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
16c80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
16c90 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
16ca0 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
16cb0 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
16cc0 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
16cd0 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
16ce0 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
16cf0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
16d00 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
16d10 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
16d20 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
16d30 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
16d40 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
16d50 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
16d60 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
16d70 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
16d80 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
16d90 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
16da0 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
16db0 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
16dc0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
16dd0 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
16de0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
16df0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
16e00 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
16e10 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
16e20 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
16e30 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
16e40 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
16e50 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
16e60 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
16e70 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
16e80 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
16e90 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
16ea0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
16eb0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
16ec0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
16ed0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
16ee0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
16ef0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
16f00 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
16f10 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
16f20 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
16f30 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
16f40 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
16f50 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
16f60 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
16f70 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
16f80 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
16f90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
16fa0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
16fb0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
16fc0 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
16fd0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
16fe0 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
16ff0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
17000 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
17010 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
17020 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
17030 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
17040 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
17050 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
17060 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
17070 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
17080 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
17090 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
170a0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
170b0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
170c0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
170d0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
170e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
170f0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
17100 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
17110 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
17120 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
17130 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
17140 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
17150 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
17160 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
17170 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
17180 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
17190 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
171a0 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
171b0 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
171c0 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
171d0 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
171e0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
171f0 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
17200 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
17210 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
17220 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
17230 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
17240 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
17250 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
17260 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
17270 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
17280 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
17290 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
172a0 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
172b0 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
172c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
172d0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
172e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
172f0 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
17300 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
17310 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
17320 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
17330 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
17340 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
17350 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
17360 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
17370 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
17380 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
17390 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
173a0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
173b0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
173c0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
173d0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
173e0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
173f0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
17400 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
17410 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
17420 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
17430 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
17440 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
17450 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
17460 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
17470 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
17480 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
17490 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
174a0 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
174b0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
174c0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
174d0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
174e0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
174f0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
17500 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
17510 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
17520 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
17530 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
17540 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
17550 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17560 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
17570 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
17580 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
17590 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
175a0 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
175b0 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
175c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
175d0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
175e0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
175f0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
17600 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
17610 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
17620 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
17630 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
17640 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
17650 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
17660 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
17670 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
17680 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
17690 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  1);.  }.}../*.**
176a0 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74   If pBt points t
176b0 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20  o an empty file 
176c0 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61  then convert tha
176d0 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20  t empty file.** 
176e0 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79  into a new empty
176f0 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69   database by ini
17700 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69  tializing the fi
17710 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  rst page of.** t
17720 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
17730 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
17740 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20  tabase(BtShared 
17750 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
17760 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65   *pP1;.  unsigne
17770 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20  d char *data;.  
17780 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
17790 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
177a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
177b0 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
177c0 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
177d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
177e0 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
177f0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
17800 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
17810 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
17820 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
17830 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
17840 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
17850 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
17860 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
17870 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
17880 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
17890 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
178a0 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
178b0 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74  er)==16 );.  dat
178c0 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42  a[16] = (u8)((pB
178d0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26  t->pageSize>>8)&
178e0 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37  0xff);.  data[17
178f0 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
17900 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66  ageSize>>16)&0xf
17910 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d  f);.  data[18] =
17920 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d   1;.  data[19] =
17930 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   1;.  assert( pB
17940 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70  t->usableSize<=p
17950 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20  Bt->pageSize && 
17960 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b  pBt->usableSize+
17970 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69  255>=pBt->pageSi
17980 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20  ze);.  data[20] 
17990 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  = (u8)(pBt->page
179a0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
179b0 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b  leSize);.  data[
179c0 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
179d0 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
179e0 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
179f0 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
17a00 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
17a10 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
17a20 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
17a30 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
17a40 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
17a50 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f  |= BTS_PAGESIZE_
17a60 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53  FIXED;.#ifndef S
17a70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17a80 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
17a90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
17aa0 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
17ab0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
17ac0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
17ad0 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
17ae0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
17af0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
17b00 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
17b10 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
17b20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
17b30 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
17b40 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
17b50 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67  ndif.  pBt->nPag
17b60 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31  e = 1;.  data[31
17b70 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 1;.  return 
17b80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17b90 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
17ba0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
17bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17bc0 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64  le (creating a d
17bd0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69  atabase.** consi
17be0 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c  sting of a singl
17bf0 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63  e page and no sc
17c00 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52  hema objects). R
17c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
17c20 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ** if successful
17c30 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
17c40 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77  rror code otherw
17c50 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ise..*/.int sqli
17c60 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74  te3BtreeNewDb(Bt
17c70 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
17c80 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
17c90 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
17ca0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
17cb0 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
17cc0 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71  se(p->pBt);.  sq
17cd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17ce0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
17cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
17d00 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77  t to start a new
17d10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20   transaction. A 
17d20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
17d30 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20  n.** is started 
17d40 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
17d50 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72  gument is nonzer
17d60 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72  o, otherwise a r
17d70 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ead-.** transact
17d80 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
17d90 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
17da0 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78  2 or more and ex
17db0 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73  clusive.** trans
17dc0 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
17dd0 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  d, meaning that 
17de0 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
17df0 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74   is allowed.** t
17e00 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
17e10 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69  abase.  A preexi
17e20 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f  sting transactio
17e30 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20  n may not be.** 
17e40 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c  upgraded to excl
17e50 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67  usive by calling
17e60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20   this routine a 
17e70 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68  second time - th
17e80 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79  e.** exclusivity
17e90 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73   flag only works
17ea0 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73   for a new trans
17eb0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
17ec0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
17ed0 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65  n must be starte
17ee0 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74  d before attempt
17ef0 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e  ing any .** chan
17f00 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
17f10 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
17f20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
17f30 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f  ines .** will wo
17f40 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e  rk unless a tran
17f50 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
17f60 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20  ed first:.**.** 
17f70 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17f80 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a  eCreateTable().*
17f90 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
17fa0 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29  reeCreateIndex()
17fb0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
17fc0 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28  BtreeClearTable(
17fd0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
17fe0 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28  3BtreeDropTable(
17ff0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
18000 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a  3BtreeInsert().*
18010 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
18020 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20  reeDelete().**  
18030 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18040 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a  UpdateMeta().**.
18050 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c  ** If an initial
18060 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75   attempt to acqu
18070 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69  ire the lock fai
18080 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ls because of lo
18090 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a  ck contention.**
180a0 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
180b0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
180c0 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20   unlocked, then 
180d0 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
180e0 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68  handler.** if th
180f0 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74  ere is one.  But
18100 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72   if there was pr
18110 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d  eviously a read-
18120 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20  lock, do not.** 
18130 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
18140 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72  handler - just r
18150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
18160 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y.  SQLITE_BUSY 
18170 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
18180 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c  when there is al
18190 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
181a0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76  k in order to av
181b0 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a  oid a deadlock..
181c0 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  **.** Suppose th
181d0 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63  ere are two proc
181e0 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20  esses A and B.  
181f0 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  A has a read loc
18200 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61  k and B has.** a
18210 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20   reserved lock. 
18220 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d   B tries to prom
18230 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ote to exclusive
18240 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20   but is blocked 
18250 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27  because.** of A'
18260 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20  s read lock.  A 
18270 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
18280 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74   to reserved but
18290 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42   is blocked by B
182a0 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20  ..** One or the 
182b0 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f  other of the two
182c0 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20   processes must 
182d0 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72  give way or ther
182e0 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70  e can be.** no p
182f0 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74  rogress.  By ret
18300 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55  urning SQLITE_BU
18310 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b  SY and not invok
18320 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c  ing the busy cal
18330 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20  lback.** when A 
18340 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
18350 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f  ad lock, we enco
18360 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20  urage A to give 
18370 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20  up and let B.** 
18380 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20  proceed..*/.int 
18390 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
183a0 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c  nTrans(Btree *p,
183b0 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20   int wrflag){.  
183c0 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
183d0 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20  = 0;.  BtShared 
183e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
183f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18400 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
18410 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18420 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
18430 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
18440 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
18450 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
18460 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
18470 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
18480 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
18490 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
184a0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
184b0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
184c0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
184d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
184e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
184f0 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
18500 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
18510 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
18520 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
18530 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
18540 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
18550 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
18560 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   || IfNotOmitAV(
18570 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
18580 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  )==0 );..  /* Wr
18590 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
185a0 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
185b0 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
185c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
185d0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
185e0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
185f0 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
18600 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
18610 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
18620 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
18630 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
18640 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
18650 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49 66  ED_CACHE.  /* If
18660 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
18670 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
18680 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
18690 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
186a0 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
186b0 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
186c0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
186d0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
186e0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
186f0 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
18700 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a  LITE_LOCKED..  *
18710 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67 20  /.  if( (wrflag 
18720 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
18730 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
18740 54 45 29 0a 20 20 20 7c 7c 20 28 70 42 74 2d 3e  TE).   || (pBt->
18750 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
18760 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 29 7b 0a  ENDING)!=0.  ){.
18770 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74      pBlock = pBt
18780 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20  ->pWriter->db;. 
18790 20 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61   }else if( wrfla
187a0 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
187b0 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
187c0 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
187d0 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
187e0 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
187f0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
18800 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
18810 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
18820 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
18830 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18840 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18850 20 7d 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20   }.  if( pBlock 
18860 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
18870 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
18880 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
18890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
188a0 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
188b0 48 45 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  HE;.    goto tra
188c0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65  ns_begun;.  }.#e
188d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72  ndif..  /* Any r
188e0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64  ead-only or read
188f0 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69  -write transacti
18900 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65 61  on implies a rea
18910 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20  d-lock on .  ** 
18920 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73 6f  page 1. So if so
18930 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64 2d  me other shared-
18940 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c 72  cache client alr
18950 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74 65  eady has a write
18960 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70  -lock .  ** on p
18970 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e 73  age 1, the trans
18980 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  action cannot be
18990 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63   opened. */.  rc
189a0 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61   = querySharedCa
189b0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
189c0 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41  MASTER_ROOT, REA
189d0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53  D_LOCK);.  if( S
189e0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67  QLITE_OK!=rc ) g
189f0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
18a00 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ..  pBt->btsFlag
18a10 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41  s &= ~BTS_INITIA
18a20 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28  LLY_EMPTY;.  if(
18a30 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29   pBt->nPage==0 )
18a40 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
18a50 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  = BTS_INITIALLY_
18a60 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20  EMPTY;.  do {.  
18a70 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74    /* Call lockBt
18a80 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74 68  ree() until eith
18a90 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20 69  er pBt->pPage1 i
18aa0 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20  s populated or. 
18ab0 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28     ** lockBtree(
18ac0 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74 68  ) returns someth
18ad0 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ing other than S
18ae0 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74  QLITE_OK. lockBt
18af0 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79  ree().    ** may
18b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18b10 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74 2d  K but leave pBt-
18b20 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20 30  >pPage1 set to 0
18b30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a 2a   if after.    **
18b40 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31 20   reading page 1 
18b50 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68 61  it discovers tha
18b60 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
18b70 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
18b80 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  .    ** file is 
18b90 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  not pBt->pageSiz
18ba0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
18bb0 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c 6c  lockBtree() will
18bc0 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20 70   update.    ** p
18bd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f 20  Bt->pageSize to 
18be0 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
18bf0 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73   the file on dis
18c00 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68  k..    */.    wh
18c10 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
18c20 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
18c30 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65  ==(rc = lockBtre
18c40 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20  e(pBt)) );..    
18c50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18c60 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
18c70 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 62       if( (pBt->b
18c80 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
18c90 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  AD_ONLY)!=0 ){. 
18ca0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18cb0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
18cc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18cd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
18ce0 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50  gerBegin(pBt->pP
18cf0 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71  ager,wrflag>1,sq
18d00 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
18d10 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  y(p->db));.     
18d20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18d30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18d40 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
18d50 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
18d60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
18d70 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
18d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18d90 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
18da0 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
18db0 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63   }.  }while( (rc
18dc0 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xFF)==SQLITE_B
18dd0 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
18de0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
18df0 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
18e00 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
18e10 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
18e20 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
18e30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
18e40 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
18e50 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
18e60 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
18e70 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  ion++;.#ifndef S
18e80 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
18e90 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69 66  D_CACHE.      if
18ea0 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
18eb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
18ec0 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d   p->lock.pBtree=
18ed0 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54  =p && p->lock.iT
18ee0 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20  able==1 );.     
18ef0 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b     p->lock.eLock
18f00 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20   = READ_LOCK;.  
18f10 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e        p->lock.pN
18f20 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
18f30 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 70  ;.        pBt->p
18f40 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b  Lock = &p->lock;
18f50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
18f60 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54      }.    p->inT
18f70 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54  rans = (wrflag?T
18f80 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53  RANS_WRITE:TRANS
18f90 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20  _READ);.    if( 
18fa0 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e  p->inTrans>pBt->
18fb0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  inTransaction ){
18fc0 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
18fd0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69  ansaction = p->i
18fe0 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  nTrans;.    }.  
18ff0 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
19000 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
19010 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
19020 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ge1;.#ifndef SQL
19030 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
19040 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73 65  CACHE.      asse
19050 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74 65  rt( !pBt->pWrite
19060 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r );.      pBt->
19070 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20 20  pWriter = p;.   
19080 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
19090 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53 49   &= ~BTS_EXCLUSI
190a0 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72  VE;.      if( wr
190b0 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62 74  flag>1 ) pBt->bt
190c0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45 58  sFlags |= BTS_EX
190d0 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a  CLUSIVE;.#endif.
190e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
190f0 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72 20   db-size header 
19100 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72 65  field is incorre
19110 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62 65  ct (as it may be
19120 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20   if an old.     
19130 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20 62   ** client has b
19140 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20  een writing the 
19150 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c 20  database file), 
19160 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20 44  update it now. D
19170 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 68  oing.      ** th
19180 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  is sooner rather
19190 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e   than later mean
191a0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  s the database s
191b0 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20 0a  ize can safely .
191c0 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61 64        ** re-read
191d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
191e0 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20 69  ze from page 1 i
191f0 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f 72  f a savepoint or
19200 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
19210 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f     ** rollback o
19220 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
19230 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
19240 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
19250 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74   pBt->nPage!=get
19260 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
19270 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20  Data[28]) ){.   
19280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19290 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
192a0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
192b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
192c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
192d0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
192e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
192f0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
19300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19310 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61  .    }.  }...tra
19320 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
19330 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19340 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f   wrflag ){.    /
19350 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65  * This call make
19360 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  s sure that the 
19370 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63 6f  pager has the co
19380 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a  rrect number of.
19390 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
193a0 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
193b0 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
193c0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
193d0 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65  0 and.    ** the
193e0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
193f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  not already open
19400 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62  , then it will b
19410 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20  e opened here.. 
19420 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
19430 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
19440 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
19450 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
19460 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20  vepoint);.  }.. 
19470 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
19480 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
19490 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
194a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
194b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
194c0 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a  AUTOVACUUM../*.*
194d0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
194e0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r-map entries fo
194f0 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f  r all children o
19500 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c  f page pPage. Al
19510 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20  so, if.** pPage 
19520 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74  contains cells t
19530 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
19540 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74  rflow pages, set
19550 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
19560 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
19570 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
19580 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73  es as well..*/.s
19590 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69  tatic int setChi
195a0 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67  ldPtrmaps(MemPag
195b0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
195c0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
195d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195e0 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61  /* Counter varia
195f0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ble */.  int nCe
19600 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
19610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19620 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
19630 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a  n page pPage */.
19640 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
19670 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  ode */.  BtShare
19680 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
19690 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74  pBt;.  u8 isInit
196a0 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73  Orig = pPage->is
196b0 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  Init;.  Pgno pgn
196c0 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b  o = pPage->pgno;
196d0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
196e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
196f0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
19700 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
19710 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
19720 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19730 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
19740 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
19750 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
19760 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
19770 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
19780 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
19790 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
197a0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
197b0 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
197c0 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
197d0 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
197e0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
197f0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
19800 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
19810 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
19820 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
19830 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
19840 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
19850 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
19860 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
19870 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
19880 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
19890 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
198a0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
198b0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
198c0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
198d0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
198e0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
198f0 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69  c);.  }..set_chi
19900 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a  ld_ptrmaps_out:.
19910 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
19920 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20  = isInitOrig;.  
19930 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19940 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e  .** Somewhere on
19950 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e   pPage is a poin
19960 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f  ter to page iFro
19970 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20  m.  Modify this 
19980 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68  pointer so.** th
19990 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
199a0 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
199b0 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
199c0 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
199d0 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69  er to.** be modi
199e0 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77  fied, as  follow
199f0 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
19a00 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
19a10 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
19a20 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
19a30 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
19a40 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19a50 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
19a60 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
19a70 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
19a80 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
19a90 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
19aa0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
19ab0 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
19ac0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
19ad0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
19ae0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
19af0 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
19b00 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
19b10 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
19b20 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
19b30 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
19b40 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
19b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
19b70 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
19b80 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
19b90 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
19ba0 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
19bb0 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
19bc0 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
19bd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19be0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
19bf0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19c00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19c10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
19c20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
19c30 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
19c40 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
19c50 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
19c60 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
19c70 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
19c80 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
19c90 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
19ca0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
19cb0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
19cc0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
19cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
19ce0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
19cf0 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
19d00 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
19d10 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
19d20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
19d30 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
19d40 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
19d50 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 62  nt nCell;..    b
19d60 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
19d70 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ge);.    nCell =
19d80 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
19d90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
19da0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
19db0 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
19dc0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
19dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
19de0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
19df0 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
19e00 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
19e10 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
19e20 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
19e30 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
19e40 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
19e50 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  Overflow.       
19e60 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
19e70 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d 70 50 61  iOverflow+3<=pPa
19e80 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d  ge->aData+pPage-
19e90 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20 20 20 20  >maskPage.      
19ea0 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74     && iFrom==get
19eb0 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
19ec0 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 0a 20 20  o.iOverflow]).  
19ed0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
19ee0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43 65     put4byte(&pCe
19ef0 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
19f00 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  w], iTo);.      
19f10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
19f20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
19f30 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
19f40 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
19f50 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
19f60 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
19f70 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
19f80 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
19f90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
19fa0 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
19fb0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
19fc0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
19fd0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
19fe0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
19ff0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1a000 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1a010 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1a020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a030 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1a040 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1a050 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1a060 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1a070 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1a080 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
1a090 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1a0a0 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
1a0b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a0c0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1a0d0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1a0e0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1a0f0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1a100 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1a110 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1a120 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1a130 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1a140 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1a150 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1a160 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1a170 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1a180 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1a190 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1a1a0 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1a1b0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1a1c0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1a1d0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1a1e0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1a1f0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1a200 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1a210 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1a220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1a230 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1a240 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1a250 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1a260 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1a270 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1a280 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1a290 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1a2a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a2b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1a2c0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1a2d0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1a2e0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1a2f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1a300 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1a310 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1a320 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1a330 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1a340 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1a350 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1a360 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1a370 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1a380 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1a390 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1a3a0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1a3b0 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1a3c0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1a3d0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1a3e0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1a3f0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1a400 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1a410 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1a420 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1a430 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1a440 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1a450 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1a460 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1a470 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1a480 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1a490 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1a4a0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1a4b0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1a4c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1a4d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1a4e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1a4f0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1a500 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1a510 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1a520 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1a530 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1a540 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1a550 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1a560 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1a570 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1a580 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1a590 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1a5a0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1a5b0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1a5c0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1a5d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1a5e0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1a5f0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1a600 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1a610 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1a620 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a630 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1a640 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1a650 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1a660 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1a670 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1a680 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1a690 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1a6a0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1a6b0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1a6c0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1a6d0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1a6e0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1a6f0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1a700 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1a710 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1a720 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1a730 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1a740 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1a750 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1a760 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1a770 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1a780 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1a790 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1a7a0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1a7b0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1a7c0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1a7d0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1a7e0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1a7f0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1a800 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1a810 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1a820 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1a830 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1a840 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1a850 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1a860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1a870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1a880 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1a890 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1a8a0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1a8b0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1a8c0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1a8d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1a8e0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1a8f0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1a900 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1a910 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1a920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a930 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1a940 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1a950 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1a960 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1a970 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1a980 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1a990 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1a9a0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1a9b0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1a9c0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1a9d0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1a9e0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1a9f0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1aa00 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1aa10 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1aa20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1aa30 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1aa40 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1aa50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1aa60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1aa70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1aa80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1aa90 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1aaa0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1aab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1aac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1aad0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1aae0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1aaf0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1ab00 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1ab10 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1ab20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1ab30 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1ab40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1ab50 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1ab60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ab70 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1ab80 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1ab90 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1aba0 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1abb0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1abc0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1abd0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1abe0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1abf0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1ac00 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1ac10 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1ac20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1ac30 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1ac40 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1ac50 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1ac60 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1ac70 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1ac80 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1ac90 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1aca0 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1acb0 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1acc0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1acd0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1ace0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1acf0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1ad00 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1ad10 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1ad20 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1ad30 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1ad40 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1ad50 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1ad60 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1ad70 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1ad80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1ad90 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1ada0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1adb0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1adc0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1add0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1ade0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1adf0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1ae00 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1ae10 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1ae20 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1ae30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1ae40 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1ae50 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1ae60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1ae70 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1ae80 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1ae90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1aea0 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1aeb0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1aec0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1aed0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1aee0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1aef0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1af00 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1af10 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1af20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1af30 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1af40 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1af50 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1af60 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1af70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1af80 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1af90 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1afa0 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1afb0 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1afc0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1afd0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1afe0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1aff0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1b000 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1b010 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1b020 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b030 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1b040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1b050 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1b060 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1b070 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1b080 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1b090 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1b0a0 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1b0b0 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1b0c0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1b0d0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1b0e0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1b0f0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1b100 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1b110 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1b120 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1b130 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1b140 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1b150 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1b160 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1b170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b180 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b190 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1b1a0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1b1b0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1b1c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b1d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1b1e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1b1f0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1b200 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1b210 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1b220 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1b230 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1b240 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1b250 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1b260 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1b270 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1b280 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1b290 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1b2a0 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1b2b0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1b2c0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1b2d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1b2e0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1b2f0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1b300 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1b310 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1b320 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1b330 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1b340 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1b350 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1b360 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1b370 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1b380 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1b390 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1b3a0 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1b3b0 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1b3c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1b3d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b3e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1b3f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1b400 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1b410 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1b420 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1b430 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1b440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1b450 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1b460 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1b470 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1b480 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1b490 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1b4a0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1b4b0 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1b4c0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1b4d0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1b4e0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1b4f0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1b500 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1b510 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1b520 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1b530 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1b540 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1b550 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1b560 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1b570 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1b580 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1b590 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b5a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1b5b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b5c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1b5d0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1b5e0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1b5f0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1b600 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1b610 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1b620 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1b630 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1b640 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1b650 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1b660 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1b670 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1b680 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1b690 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1b6a0 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1b6b0 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1b6c0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1b6d0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1b6e0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1b6f0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1b700 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1b710 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1b720 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1b730 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1b740 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1b750 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1b760 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1b770 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1b780 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1b790 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1b7a0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1b7b0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1b7c0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1b7d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1b7e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b7f0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1b800 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1b810 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b830 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1b840 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1b850 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1b860 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1b870 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b880 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1b890 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1b8a0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1b8b0 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1b8c0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1b8d0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1b8e0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1b8f0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1b900 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b920 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b930 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b940 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1b950 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1b960 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1b970 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1b980 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1b990 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1b9a0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1b9b0 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1b9c0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1b9d0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1b9e0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1b9f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ba00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1ba10 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1ba20 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1ba30 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1ba40 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1ba50 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1ba60 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1ba70 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1ba80 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1ba90 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1baa0 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1bab0 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1bac0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1bad0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1bae0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1baf0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1bb00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1bb10 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1bb20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1bb30 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1bb40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1bb50 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1bb60 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1bb70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1bb80 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1bb90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bba0 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1bbb0 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1bbc0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1bbf0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1bc00 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1bc10 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1bc20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1bc30 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1bc40 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1bc50 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1bc60 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1bc70 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1bc80 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1bc90 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1bca0 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1bcb0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1bcc0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1bcd0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1bce0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1bcf0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1bd00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1bd10 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1bd20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1bd30 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1bd40 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1bd50 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1bd60 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1bd70 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1bd80 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1bd90 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1bda0 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1bdb0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1bdc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1bdd0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1bde0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1bdf0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1be00 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1be10 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1be20 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1be30 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1be40 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1be50 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1be60 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1be70 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1be80 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1be90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1bea0 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1beb0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1bec0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1bed0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1bee0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1bef0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1bf00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bf10 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1bf20 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1bf30 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1bf40 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1bf50 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1bf60 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1bf70 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1bf80 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1bf90 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1bfa0 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1bfb0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1bfc0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1bfd0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1bfe0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1bff0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1c000 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1c010 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1c020 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1c030 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1c040 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1c050 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1c060 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1c070 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1c080 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c090 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1c0a0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1c0b0 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1c0c0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1c0d0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1c0e0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1c0f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1c100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c110 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c120 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1c130 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1c140 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1c150 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1c160 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1c170 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1c180 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1c190 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c1a0 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1c1b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1c1c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1c1d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1c1e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1c1f0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1c200 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1c210 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1c220 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1c230 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1c240 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1c250 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1c260 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1c270 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1c280 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1c290 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1c2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c2b0 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1c2c0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1c2d0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1c2e0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1c2f0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1c300 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1c310 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1c320 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1c330 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1c340 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1c350 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1c360 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1c370 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1c380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1c390 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1c3a0 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1c3b0 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1c3c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1c3d0 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
1c3e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1c3f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1c400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1c410 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1c420 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1c430 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1c440 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1c450 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1c460 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1c470 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1c480 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1c490 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1c4a0 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1c4b0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1c4c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1c4d0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1c4e0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1c4f0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1c500 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1c510 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1c520 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1c530 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1c540 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1c550 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1c560 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1c570 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1c580 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1c590 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1c5a0 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1c5b0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1c5c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1c5d0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1c5e0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1c5f0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1c600 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1c610 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1c620 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1c630 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1c640 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1c650 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1c660 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1c670 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1c680 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1c690 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1c6a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c6b0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c6c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1c6d0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1c6e0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1c6f0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1c700 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1c710 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1c720 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1c730 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1c740 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1c750 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1c760 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1c770 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1c780 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1c790 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1c7a0 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1c7b0 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1c7c0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1c7d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1c7e0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1c7f0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1c800 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1c810 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1c820 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1c830 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1c840 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c850 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1c860 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1c870 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1c880 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1c890 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1c8a0 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1c8b0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1c8c0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1c8d0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1c8e0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1c8f0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1c900 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1c910 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1c920 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1c930 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1c940 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c950 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1c960 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1c970 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1c980 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1c990 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1c9a0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1c9b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1c9c0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1c9d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1c9e0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1c9f0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1ca00 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1ca10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1ca20 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1ca30 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1ca40 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1ca50 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1ca60 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1ca70 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ca80 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1ca90 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1caa0 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1cab0 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1cac0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1cad0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1cae0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1caf0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1cb00 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1cb10 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1cb20 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1cb30 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1cb40 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1cb50 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1cb60 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1cb70 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1cb80 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1cb90 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1cba0 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1cbb0 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1cbc0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1cbd0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1cbe0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1cbf0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1cc00 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1cc10 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1cc20 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1cc30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1cc40 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1cc50 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1cc60 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1cc70 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1cc80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cc90 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1cca0 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1ccb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1ccc0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1ccd0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1cce0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1ccf0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1cd00 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1cd10 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1cd20 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1cd30 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1cd40 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1cd50 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1cd60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1cd70 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1cd80 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1cd90 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1cda0 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1cdb0 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1cdc0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1cdd0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1cde0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1cdf0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1ce00 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1ce10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1ce20 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1ce30 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1ce40 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1ce50 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1ce60 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1ce70 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1ce80 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1ce90 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1cea0 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1ceb0 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1cec0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1ced0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1cee0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1cef0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1cf00 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1cf10 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1cf20 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1cf30 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1cf40 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1cf50 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1cf60 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1cf70 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1cf80 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1cf90 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1cfa0 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1cfb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1cfc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1cfd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1cfe0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1cff0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1d000 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1d010 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1d020 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1d030 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1d040 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1d050 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1d060 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1d070 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1d080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d090 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1d0a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1d0b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d0c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1d0d0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1d0e0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1d0f0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1d100 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1d110 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1d120 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1d130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1d140 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1d150 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1d160 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1d170 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1d180 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1d190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d1a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d1b0 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1d1c0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1d1d0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1d1e0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1d1f0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1d200 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1d210 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1d220 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1d230 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1d240 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1d250 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1d260 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1d270 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1d280 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1d290 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1d2a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1d2b0 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1d2c0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1d2d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1d2e0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1d2f0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1d300 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1d310 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1d320 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1d330 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1d340 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1d350 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1d360 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1d370 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1d380 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1d390 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1d3a0 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1d3b0 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1d3c0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1d3d0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1d3e0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1d3f0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1d400 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1d410 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1d420 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1d430 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1d440 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1d450 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1d460 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1d470 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1d480 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1d490 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1d4a0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1d4b0 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1d4c0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1d4d0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1d4e0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1d4f0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1d500 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1d510 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1d520 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1d530 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1d540 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1d550 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1d560 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1d570 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1d580 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1d590 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1d5a0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1d5b0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1d5c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1d5d0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1d5e0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1d5f0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1d600 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1d610 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1d620 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1d630 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1d640 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1d650 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1d660 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1d670 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1d680 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1d690 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1d6a0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1d6b0 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1d6c0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1d6d0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1d6e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1d6f0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1d700 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1d710 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1d720 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1d730 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1d740 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1d750 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1d760 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1d770 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1d780 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1d790 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1d7a0 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1d7b0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1d7c0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1d7d0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1d7e0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1d7f0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1d800 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1d810 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1d820 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1d830 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1d840 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1d850 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1d860 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1d870 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1d880 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1d890 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1d8a0 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1d8b0 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1d8c0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1d8d0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1d8e0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1d8f0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1d900 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1d910 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1d920 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1d930 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1d940 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1d950 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1d960 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1d970 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1d980 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1d990 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1d9a0 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1d9b0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1d9c0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1d9d0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1d9e0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1d9f0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1da00 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1da10 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1da20 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1da30 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1da40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1da50 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1da60 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1da70 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1da80 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1da90 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1daa0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1dab0 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1dac0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1dad0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1dae0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1daf0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1db00 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1db10 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1db20 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1db30 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1db40 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1db50 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1db60 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1db70 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1db80 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1db90 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1dba0 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1dbb0 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1dbc0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1dbd0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1dbe0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1dbf0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1dc00 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1dc10 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1dc20 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1dc30 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1dc40 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1dc50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1dc60 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1dc70 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1dc80 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1dc90 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1dca0 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1dcb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1dcc0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1dcd0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1dce0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1dcf0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1dd00 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1dd10 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
1dd20 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
1dd30 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
1dd40 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
1dd50 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
1dd60 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
1dd70 2a 2f 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 57 52 49 54 45  ans==TRANS_WRITE
1dd90 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1dda0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1ddb0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
1ddc0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
1ddd0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1dde0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
1ddf0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
1de00 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
1de10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1de20 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
1de30 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
1de40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1de50 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
1de60 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
1de70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1de80 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
1de90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
1dea0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
1deb0 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
1dec0 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
1ded0 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
1dee0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1def0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
1df00 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
1df10 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
1df20 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1df30 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1df40 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1df50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1df60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1df70 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
1df80 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
1df90 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
1dfa0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
1dfb0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
1dfc0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
1dfd0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
1dfe0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
1dff0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
1e000 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
1e010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1e020 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1e030 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1e040 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
1e050 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1e060 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e070 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1e080 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
1e090 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
1e0a0 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
1e0b0 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
1e0c0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
1e0d0 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
1e0e0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
1e0f0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
1e100 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
1e110 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
1e120 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
1e130 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
1e140 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
1e150 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
1e160 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
1e170 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
1e180 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
1e190 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
1e1a0 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
1e1b0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
1e1c0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
1e1d0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
1e1e0 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
1e1f0 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
1e200 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
1e210 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e220 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
1e230 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
1e240 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
1e250 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
1e260 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
1e270 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
1e280 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
1e290 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
1e2a0 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
1e2b0 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
1e2c0 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
1e2d0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
1e2e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
1e2f0 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
1e300 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
1e310 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
1e320 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
1e330 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
1e340 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
1e350 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
1e360 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
1e370 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
1e380 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
1e390 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
1e3a0 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
1e3b0 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
1e3c0 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
1e3d0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
1e3e0 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
1e3f0 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
1e400 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
1e410 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
1e420 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
1e430 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
1e440 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
1e450 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
1e460 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
1e470 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
1e480 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
1e490 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
1e4a0 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
1e4b0 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
1e4c0 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
1e4d0 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
1e4e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1e4f0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
1e500 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
1e510 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
1e520 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
1e530 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
1e540 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1e550 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e560 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
1e570 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
1e580 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
1e590 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
1e5a0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
1e5b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e5c0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
1e5d0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
1e5e0 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
1e5f0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
1e600 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
1e610 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1e620 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
1e630 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
1e640 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
1e650 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
1e660 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
1e670 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
1e680 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
1e690 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
1e6a0 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
1e6b0 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
1e6c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1e6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1e6e0 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73   = saveCursorPos
1e6f0 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20  ition(p);.      
1e700 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e720 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74       (void)sqlit
1e730 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
1e740 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63  rsors(pBtree, rc
1e750 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1e760 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1e770 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1e780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e790 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1e7a0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
1e7b0 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
1e7c0 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  e = CURSOR_FAULT
1e7d0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69  ;.        p->ski
1e7e0 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b  pNext = errCode;
1e7f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1e800 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50  or(i=0; i<=p->iP
1e810 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1e820 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e830 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1e840 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b        p->apPage[
1e850 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
1e860 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1e870 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1e880 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1e890 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1e8a0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
1e8b0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
1e8c0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72  ess..**.** If tr
1e8d0 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
1e8e0 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72  LITE_OK then cur
1e8f0 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76  sors will be inv
1e900 61 6c 69 64 61 74 65 64 20 28 74 72 69 70 70 65  alidated (trippe
1e910 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  d)..** Only writ
1e920 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72  e cursors are tr
1e930 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e  ipped if writeOn
1e940 6c 79 20 69 73 20 74 72 75 65 20 62 75 74 20 61  ly is true but a
1e950 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a  ll cursors are.*
1e960 2a 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  * tripped if wri
1e970 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e  teOnly is false.
1e980 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
1e990 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65   use.** a trippe
1e9a0 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65  d cursor will re
1e9b0 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
1e9c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1e9d0 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1e9e0 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1e9f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1ea00 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1ea10 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1ea20 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1ea30 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1ea40 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1ea50 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
1ea60 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69  tree *p, int tri
1ea70 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65  pCode, int write
1ea80 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
1ea90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1eaa0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
1eab0 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
1eac0 20 61 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e   assert( writeOn
1ead0 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==1 || writeOn
1eae0 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ly==0 );.  asser
1eaf0 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  t( tripCode==SQL
1eb00 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
1eb10 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d  CK || tripCode==
1eb20 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
1eb30 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1eb40 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43  (p);.  if( tripC
1eb50 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
1eb60 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70 43  {.    rc = tripC
1eb70 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  ode = saveAllCur
1eb80 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1eb90 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 77 72  .    if( rc ) wr
1eba0 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d  iteOnly = 0;.  }
1ebb0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
1ebc0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1ebd0 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a  if( tripCode ){.
1ebe0 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71      int rc2 = sq
1ebf0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
1ec00 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70  lCursors(p, trip
1ec10 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29  Code, writeOnly)
1ec20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
1ec30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  ==SQLITE_OK || (
1ec40 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20  writeOnly==0 && 
1ec50 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  rc2==SQLITE_OK) 
1ec60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d  );.    if( rc2!=
1ec70 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
1ec80 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65   rc2;.  }.  btre
1ec90 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
1eca0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1ecb0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1ecc0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20  .    int rc2;.. 
1ecd0 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
1ece0 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
1ecf0 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
1ed00 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
1ed10 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
1ed20 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
1ed30 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
1ed40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1ed50 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
1ed60 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
1ed70 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
1ed80 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
1ed90 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
1eda0 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65      ** call btre
1edb0 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61  eGetPage() on pa
1edc0 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61  ge 1 again to ma
1edd0 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70  ke.    ** sure p
1ede0 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20  Page1->aData is 
1edf0 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a  set correctly. *
1ee00 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65 47  /.    if( btreeG
1ee10 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
1ee20 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49  pPage1, 0)==SQLI
1ee30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1ee40 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62  nt nPage = get4b
1ee50 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67  yte(28+(u8*)pPag
1ee60 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  e1->aData);.    
1ee70 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 67    testcase( nPag
1ee80 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  e==0 );.      if
1ee90 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c  ( nPage==0 ) sql
1eea0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1eeb0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1eec0 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74  &nPage);.      t
1eed0 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50  estcase( pBt->nP
1eee0 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20  age!=nPage );.  
1eef0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
1ef00 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65   nPage;.      re
1ef10 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
1ef20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
1ef30 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
1ef40 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
1ef50 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
1ef60 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1ef70 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1ef80 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1ef90 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1efa0 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1efb0 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1efc0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1efd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1efe0 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
1eff0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1f000 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
1f010 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
1f020 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
1f030 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
1f040 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
1f050 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
1f060 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
1f070 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
1f080 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
1f090 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
1f0a0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
1f0b0 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
1f0c0 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
1f0d0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
1f0e0 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
1f0f0 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
1f100 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
1f110 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
1f120 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
1f130 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
1f140 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
1f150 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
1f160 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
1f170 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
1f180 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
1f190 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1f1a0 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
1f1b0 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
1f1c0 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
1f1d0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
1f1e0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1f1f0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
1f200 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
1f210 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
1f220 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
1f230 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
1f240 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
1f250 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
1f260 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
1f270 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1f280 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1f290 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
1f2a0 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
1f2b0 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
1f2c0 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
1f2d0 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
1f2e0 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
1f2f0 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
1f300 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
1f310 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
1f320 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
1f330 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
1f340 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
1f350 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
1f360 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
1f370 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
1f380 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
1f390 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
1f3a0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1f3b0 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
1f3c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1f3d0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
1f3e0 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
1f3f0 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
1f400 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1f410 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
1f420 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1f430 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
1f440 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1f450 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1f460 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
1f470 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1f480 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
1f490 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
1f4a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
1f4b0 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
1f4c0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
1f4d0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1f4e0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1f4f0 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
1f500 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
1f510 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
1f520 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
1f530 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
1f540 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
1f550 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
1f560 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
1f570 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
1f580 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
1f590 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
1f5a0 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
1f5b0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
1f5c0 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
1f5d0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
1f5e0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
1f5f0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
1f600 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
1f610 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
1f620 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1f630 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1f640 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
1f650 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1f660 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1f670 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1f680 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1f690 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
1f6a0 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
1f6b0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
1f6c0 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
1f6d0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
1f6e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
1f6f0 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
1f700 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
1f710 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
1f720 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
1f730 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
1f740 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
1f750 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
1f760 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
1f770 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
1f780 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
1f790 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
1f7a0 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
1f7b0 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
1f7c0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
1f7d0 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
1f7e0 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
1f7f0 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
1f800 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
1f810 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
1f820 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
1f830 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
1f840 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
1f850 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
1f860 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
1f870 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
1f880 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
1f890 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
1f8a0 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
1f8b0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
1f8c0 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
1f8d0 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
1f8e0 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
1f8f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1f900 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
1f910 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1f920 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1f930 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f940 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
1f950 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1f960 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
1f970 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
1f980 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
1f990 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
1f9a0 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
1f9b0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
1f9c0 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
1f9d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1f9e0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1f9f0 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
1fa00 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
1fa10 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
1fa20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fa30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1fa40 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20  f( iSavepoint<0 
1fa50 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
1fa60 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c  s & BTS_INITIALL
1fa70 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20  Y_EMPTY)!=0 ){. 
1fa80 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67         pBt->nPag
1fa90 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1faa0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1fab0 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1fac0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67    pBt->nPage = g
1fad0 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74  et4byte(28 + pBt
1fae0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29  ->pPage1->aData)
1faf0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
1fb00 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77 61  database size wa
1fb10 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
1fb20 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20  he offset 28 of 
1fb30 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20 20  the header.     
1fb40 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61   ** when the tra
1fb50 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
1fb60 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61  , so we know tha
1fb70 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f  t the value at o
1fb80 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32  ffset.      ** 2
1fb90 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f  8 is nonzero. */
1fba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1fbb0 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20  Bt->nPage>0 );. 
1fbc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1fbd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1fbe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1fbf0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
1fc00 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72  a new cursor for
1fc10 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65   the BTree whose
1fc20 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20   root is on the 
1fc30 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20  page.** iTable. 
1fc40 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  If a read-only c
1fc50 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
1fc60 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ed, it is assume
1fc70 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61  d that.** the ca
1fc80 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73  ller already has
1fc90 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64   at least a read
1fca0 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1fcb0 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65  n open.** on the
1fcc0 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64   database alread
1fcd0 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75  y. If a write-cu
1fce0 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
1fcf0 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63  d, then.** the c
1fd00 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64  aller is assumed
1fd10 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e   to have an open
1fd20 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1fd30 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46  on..**.** If wrF
1fd40 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  lag==0, then the
1fd50 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
1fd60 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
1fd70 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c  ding..** If wrFl
1fd80 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20  ag==1, then the 
1fd90 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73  cursor can be us
1fda0 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  ed for reading o
1fdb0 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  r for.** writing
1fdc0 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74   if other condit
1fdd0 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67  ions for writing
1fde0 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20   are also met.  
1fdf0 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65  These.** are the
1fe00 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
1fe10 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20   must be met in 
1fe20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e  order for writin
1fe30 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77  g to.** be allow
1fe40 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68  ed:.**.** 1:  Th
1fe50 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61  e cursor must ha
1fe60 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77  ve been opened w
1fe70 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a  ith wrFlag==1.**
1fe80 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61  .** 2:  Other da
1fe90 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1fea0 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74 68  ns that share th
1feb0 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61 63  e same pager cac
1fec0 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68  he.**     but wh
1fed0 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74  ich are not in t
1fee0 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54  he READ_UNCOMMIT
1fef0 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f  TED state may no
1ff00 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75  t have.**     cu
1ff10 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20  rsors open with 
1ff20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65  wrFlag==0 on the
1ff30 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74   same table.  Ot
1ff40 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74  herwise.**     t
1ff50 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20  he changes made 
1ff60 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63 75  by this write cu
1ff70 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69  rsor would be vi
1ff80 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20  sible to.**     
1ff90 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  the read cursors
1ffa0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61   in the other da
1ffb0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1ffc0 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65  n..**.** 3:  The
1ffd0 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
1ffe0 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20  e writable (not 
1fff0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64  on read-only med
20000 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68  ia).**.** 4:  Th
20010 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61  ere must be an a
20020 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
20030 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63  n..**.** No chec
20040 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20  king is done to 
20050 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 70  make sure that p
20060 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c  age iTable reall
20070 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  y is the.** root
20080 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65   page of a b-tre
20090 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74  e.  If it is not
200a0 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
200b0 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69  r acquired.** wi
200c0 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ll not work corr
200d0 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ectly..**.** It 
200e0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  is assumed that 
200f0 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  the sqlite3Btree
20100 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73  CursorZero() has
20110 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20   been called.** 
20120 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69  on pCur to initi
20130 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79  alize the memory
20140 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20   space prior to 
20150 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
20160 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
20170 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72   int btreeCursor
20180 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
20190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
201b0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
201c0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
201f0 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65   of table to ope
20200 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61  n */.  int wrFla
20210 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
20220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20230 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
20240 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
20250 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
20260 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
20270 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
20280 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20  g to comparison 
20290 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74  function */.  Bt
202a0 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
202d0 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a  r new cursor */.
202e0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
202f0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20  Bt = p->pBt;    
20300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20310 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e  hared b-tree han
20320 64 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  dle */..  assert
20330 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
20340 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
20350 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
20360 3d 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20  =0 || wrFlag==1 
20370 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
20380 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
20390 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
203a0 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
203b0 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
203c0 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
203d0 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
203e0 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
203f0 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
20400 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
20410 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
20420 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
20430 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
20440 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
20450 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
20460 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
20470 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
20480 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
20490 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
204a0 77 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61  wrFlag+1) );.  a
204b0 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30  ssert( wrFlag==0
204c0 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66   || !hasReadConf
204d0 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29  licts(p, iTable)
204e0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
204f0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
20500 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20   has opened the 
20510 72 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63  required transac
20520 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72  tion. */.  asser
20530 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  t( p->inTrans>TR
20540 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73  ANS_NONE );.  as
20550 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
20560 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  || p->inTrans==T
20570 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
20580 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
20590 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ge1 && pBt->pPag
205a0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 0a 20 20  e1->aData );..  
205b0 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61 67  if( NEVER(wrFlag
205c0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
205d0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
205e0 4c 59 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  LY)!=0) ){.    r
205f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
20600 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
20610 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61   wrFlag ){.    a
20620 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
20630 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70  (pBt);.    if( p
20640 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30  Bt->pTmpSpace==0
20650 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
20660 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
20670 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
20680 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
20690 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
206a0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
206b0 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
206c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
206d0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
206e0 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
206f0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
20700 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
20710 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
20720 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
20730 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
20740 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
20750 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
20760 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
20770 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
20780 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
20790 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
207a0 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
207b0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
207c0 3d 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  = pBt;.  assert(
207d0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72   wrFlag==0 || wr
207e0 46 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65  Flag==BTCF_Write
207f0 46 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Flag );.  pCur->
20800 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61  curFlags = wrFla
20810 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
20820 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
20830 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
20840 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
20850 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
20860 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
20870 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
20880 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
20890 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
208a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
208b0 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
208c0 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
208d0 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20900 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
20910 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
20920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
20940 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
20950 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
20960 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
20970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
20990 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
209a0 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
209b0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
209c0 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
209d0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
209e0 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
209f0 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
20a00 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
20a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
20a30 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
20a40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
20a50 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20a60 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  );.  rc = btreeC
20a70 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
20a80 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
20a90 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
20aa0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20ab0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20ac0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
20ad0 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
20ae0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
20af0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
20b00 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
20b10 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
20b20 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
20b30 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
20b40 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
20b50 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
20b60 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
20b70 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
20b80 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
20b90 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
20ba0 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
20bb0 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
20bc0 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
20bd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
20be0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20bf0 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
20c00 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
20c10 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
20c20 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
20c30 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
20c40 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
20c50 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
20c60 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
20c70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
20c80 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
20c90 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
20ca0 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
20cb0 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
20cc0 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
20cd0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
20ce0 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
20cf0 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
20d00 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
20d10 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
20d20 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
20d30 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
20d40 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
20d50 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
20d60 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
20d70 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
20d80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
20d90 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
20da0 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
20db0 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
20dc0 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
20dd0 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
20de0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
20df0 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
20e00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
20e10 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
20e20 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
20e30 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
20e40 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
20e50 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
20e60 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
20e70 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
20e80 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
20e90 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
20ea0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
20eb0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
20ec0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
20ed0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
20ee0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
20ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
20f00 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
20f10 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
20f20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
20f30 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
20f40 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
20f50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20f60 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
20f70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
20f80 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
20f90 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
20fa0 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
20fb0 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
20fc0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
20fd0 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
20fe0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
20ff0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
21000 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
21010 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
21020 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
21030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
21040 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
21050 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ow);.    /* sqli
21060 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
21070 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
21080 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
21090 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
210a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
210b0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
210c0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
210d0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
210e0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
210f0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
21100 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
21110 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
21120 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
21130 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
21140 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
21150 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
21160 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
21170 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
21180 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
21190 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
211a0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
211b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
211c0 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
211d0 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20  seCell()..**.** 
211e0 32 30 30 37 2d 30 36 2d 32 35 3a 20 20 54 68 65  2007-06-25:  The
211f0 72 65 20 69 73 20 61 20 62 75 67 20 69 6e 20 73  re is a bug in s
21200 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
21210 4d 53 56 43 20 74 68 61 74 20 63 61 75 73 65 20  MSVC that cause 
21220 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20  the.** compiler 
21230 74 6f 20 63 72 61 73 68 20 77 68 65 6e 20 67 65  to crash when ge
21240 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69  tCellInfo() is i
21250 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20  mplemented as a 
21260 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68  macro..** But th
21270 65 72 65 20 69 73 20 61 20 6d 65 61 73 75 72 65  ere is a measure
21280 61 62 6c 65 20 73 70 65 65 64 20 61 64 76 61 6e  able speed advan
21290 74 61 67 65 20 74 6f 20 75 73 69 6e 67 20 74 68  tage to using th
212a0 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a  e macro on gcc.*
212b0 2a 20 28 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d  * (when less com
212c0 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a 61 74 69  piler optimizati
212d0 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20  ons like -Os or 
212e0 2d 4f 30 20 61 72 65 20 75 73 65 64 20 61 6e 64  -O0 are used and
212f0 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72   the.** compiler
21300 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67   is not doing ag
21310 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e 69 6e  gressive inlinin
21320 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65 20 61  g.)  So we use a
21330 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a   real function.*
21340 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64 20 61  * for MSVC and a
21350 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65 72 79   macro for every
21360 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54 69 63  thing else.  Tic
21370 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a 23 69  ket #2457..*/.#i
21380 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
21390 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
213a0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
213b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
213c0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
213d0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
213e0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
213f0 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
21400 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
21410 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
21420 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
21430 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
21440 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
21450 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
21460 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d  ORRUPT_DB || mem
21470 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
21480 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
21490 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
214a0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
214b0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
214c0 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
214d0 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73  _MSC_VER.  /* Us
214e0 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
214f0 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72  n in MSVC to wor
21500 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e  k around bugs in
21510 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20   that compiler. 
21520 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
21530 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
21540 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
21550 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
21560 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20  .nSize==0 ){.   
21570 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
21580 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
21590 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
215a0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
215b0 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
215c0 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
215d0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
215e0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
215f0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
21600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
21610 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
21620 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ur);.    }.  }.#
21630 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f  else /* if not _
21640 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20  MSC_VER */.  /* 
21650 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20 61  Use a macro in a
21660 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65  ll other compile
21670 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66  rs so that the f
21680 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e  unction is inlin
21690 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65  ed */.#define ge
216a0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20  tCellInfo(pCur) 
216b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216e0 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70 43 75       \.  if( pCu
216f0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
21700 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21730 20 20 20 20 20 20 5c 0a 20 20 20 20 69 6e 74 20        \.    int 
21740 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
21750 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 20 20 20 20 20 20 20 5c 0a 20 20 20 20 62 74 72         \.    btr
21790 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
217a0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
217b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
217c0 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
217d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 70 43          \.    pC
217e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
217f0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 20  BTCF_ValidNKey; 
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 20 20                  
21820 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
21830 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
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 20                  
21870 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
21880 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
21890 43 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20  Cur);           
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d             \.  }
218d0 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f  .#endif /* _MSC_
218e0 56 45 52 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  VER */..#ifndef 
218f0 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e  NDEBUG  /* The n
21900 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ext routine used
21910 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
21920 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
21930 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e   */./*.** Return
21940 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76   true if the giv
21950 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76  en BtCursor is v
21960 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63  alid.  A valid c
21970 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20  ursor is one.** 
21980 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
21990 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  y pointing to a 
219a0 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d  row in a (non-em
219b0 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54  pty) table..** T
219c0 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63  his is a verific
219d0 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73  ation routine is
219e0 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
219f0 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
21a00 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ments..*/.int sq
21a10 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
21a20 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72  IsValid(BtCursor
21a30 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
21a40 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e  n pCur && pCur->
21a50 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
21a60 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ALID;.}.#endif /
21a70 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a  * NDEBUG */../*.
21a80 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f  ** Set *pSize to
21a90 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21aa0 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20 74   buffer needed t
21ab0 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75 65  o hold the value
21ac0 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66   of.** the key f
21ad0 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
21ae0 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63 75  ntry.  If the cu
21af0 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
21b00 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c  ting.** to a val
21b10 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65  id entry, *pSize
21b20 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a   is set to 0. .*
21b30 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c 65  *.** For a table
21b40 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45 59   with the INTKEY
21b50 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73 20   flag set, this 
21b60 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
21b70 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c  the key.** itsel
21b80 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65  f, not the numbe
21b90 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
21ba0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
21bb0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f 73   caller must pos
21bc0 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f 72  ition the cursor
21bd0 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
21be0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
21bf0 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
21c00 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
21c10 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
21c20 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
21c30 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
21c40 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43  BtreeKeySize(BtC
21c50 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34  ursor *pCur, i64
21c60 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65   *pSize){.  asse
21c70 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
21c80 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
21c90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
21ca0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
21cb0 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
21cc0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53  nfo(pCur);.  *pS
21cd0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
21ce0 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e 20  .nKey;.  return 
21cf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21d00 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
21d10 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
21d20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
21d30 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
21d40 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
21d50 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a  ly points to..**
21d60 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
21d70 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
21d80 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
21d90 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
21da0 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
21db0 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
21dc0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
21dd0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
21de0 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
21df0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
21e00 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
21e10 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21e20 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65 20  ..**.** Failure 
21e30 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
21e40 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
21e50 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
21e60 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20  QLITE_OK..** It 
21e70 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77 65  might just as we
21e80 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75 72  ll be a procedur
21e90 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f 69  e (returning voi
21ea0 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69 6e  d) but we contin
21eb0 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e 20  ue.** to return 
21ec0 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c  an integer resul
21ed0 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74 6f  t code for histo
21ee0 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a  rical reasons..*
21ef0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
21f00 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
21f10 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
21f20 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74  pSize){.  assert
21f30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
21f40 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
21f50 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
21f60 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
21f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
21f80 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
21f90 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c  >iPage]->intKeyL
21fa0 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43  eaf==1 );.  getC
21fb0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
21fc0 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
21fd0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20  info.nPayload;. 
21fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21ff0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  K;.}../*.** Give
22000 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
22010 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
22020 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
22030 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
22040 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
22050 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
22060 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
22070 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
22080 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
22090 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
220a0 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
220b0 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
220c0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
220d0 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
220e0 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
220f0 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
22100 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
22110 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
22120 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
22130 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
22140 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
22150 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
22160 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
22170 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
22180 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
22190 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
221a0 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
221b0 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
221c0 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
221d0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
221e0 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
221f0 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
22200 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
22210 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
22220 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
22230 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
22240 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
22250 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
22260 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
22270 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
22280 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
22290 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
222a0 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
222b0 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
222c0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
222d0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
222e0 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
222f0 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
22300 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
22310 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
22320 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
22330 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
22340 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
22350 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
22360 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
22370 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
22380 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
22390 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
223a0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
223b0 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
223c0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
223d0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
223e0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
223f0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
22400 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
22410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
22420 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
22430 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
22440 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
22450 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
22460 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
22470 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
22480 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
22490 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
224a0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
224b0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
224c0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
224d0 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
224e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
224f0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
22500 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
22510 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22520 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
22530 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
22540 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
22550 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22560 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
22570 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
22580 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
22590 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
225a0 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
225b0 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
225c0 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
225d0 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
225e0 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
225f0 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
22600 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
22610 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
22620 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
22630 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
22640 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
22650 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
22660 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
22670 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
22680 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
22690 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
226a0 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
226b0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
226c0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
226d0 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
226e0 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
226f0 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
22700 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
22710 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
22720 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
22730 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
22740 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
22750 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
22760 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65  Guess<=btreePage
22770 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
22780 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
22790 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
227a0 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
227b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
227c0 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
227d0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
227e0 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
227f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
22800 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
22810 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
22820 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
22830 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
22840 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
22850 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
22860 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
22870 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22880 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
22890 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
228a0 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d  pPage, (ppPage==
228b0 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  0) ? PAGER_GET_R
228c0 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
228d0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
228e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
228f0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
22900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22910 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
22920 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
22930 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
22940 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
22950 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
22960 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
22970 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
22980 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
22990 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
229a0 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
229b0 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
229c0 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
229d0 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
229e0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
229f0 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
22a00 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
22a10 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
22a20 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
22a30 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
22a40 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
22a50 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
22a60 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
22a70 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
22a80 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
22a90 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
22aa0 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
22ab0 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
22ac0 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
22ad0 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
22ae0 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
22af0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
22b00 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
22b10 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
22b20 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
22b30 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
22b40 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
22b50 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
22b60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
22b70 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
22b80 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
22b90 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
22ba0 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
22bb0 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
22bc0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
22bd0 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
22be0 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
22bf0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
22c00 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
22c10 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
22c20 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
22c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22c40 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
22c50 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
22c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22c70 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
22c80 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
22c90 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
22ca0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
22cb0 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
22cc0 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
22cd0 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
22ce0 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
22cf0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
22d00 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
22d10 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
22d20 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
22d30 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
22d40 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
22d50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
22d70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
22d80 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
22d90 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
22da0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22db0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
22dc0 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
22dd0 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
22de0 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
22df0 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
22e00 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
22e10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
22e30 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
22e40 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
22e50 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
22e60 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
22e70 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
22e80 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
22e90 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
22ea0 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d  The eOp.** argum
22eb0 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74  ent is interpret
22ec0 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
22ed0 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70  *.**   0: The op
22ee0 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
22ef0 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  d. Populate the 
22f00 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
22f10 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72  **   1: The oper
22f20 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65  ation is a write
22f30 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
22f40 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
22f50 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61  *   2: The opera
22f60 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
22f70 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20  Do not populate 
22f80 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
22f90 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  he..**.** A tota
22fa0 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
22fb0 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
22fc0 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
22fd0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
22fe0 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
22ff0 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
23000 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
23010 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
23020 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
23030 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20  might appear on 
23040 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a  the main page.**
23050 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
23060 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
23070 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
23080 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
23090 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
230a0 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
230b0 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
230c0 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f  es and the.** eO
230d0 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  p argument is no
230e0 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69  t 2, this functi
230f0 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20  on may allocate 
23100 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
23110 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74  zily .** populat
23120 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
23130 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
23140 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
23150 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
23160 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
23170 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
23180 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
23190 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
231a0 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
231b0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
231c0 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
231d0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
231e0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
231f0 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
23200 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
23210 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
23220 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
23230 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
23240 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
23250 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
23260 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
23270 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
23280 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
23290 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
232a0 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
232b0 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
232c0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
232d0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
232e0 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
232f0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
23300 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
23310 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
23320 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
23330 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
23340 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
23350 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
23360 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23370 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
23380 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
23390 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
233a0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
233b0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
233c0 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
233d0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
233e0 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
233f0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
23400 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
23410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
23420 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
23430 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
23440 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
23450 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
23460 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
23470 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
23480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
23490 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
234a0 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
234b0 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
234c0 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
234d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
234e0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78  E_OK;.  int iIdx
234f0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
23500 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
23510 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23520 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67  e]; /* Btree pag
23530 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
23540 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
23550 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
23560 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
23570 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
23580 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
23590 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   to */.#ifdef SQ
235a0 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
235b0 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69  FLOW_READ.  unsi
235c0 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73  gned char * cons
235d0 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42  t pBufStart = pB
235e0 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20  uf;.  int bEnd; 
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69  /* True if readi
23620 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74  ng to end of dat
23630 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  a */.#endif..  a
23640 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
23650 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23660 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23670 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
23680 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
23690 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
236a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
236b0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
236c0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
236d0 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
236e0 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20  || offset==0 ); 
236f0 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61     /* Always sta
23700 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e  rt from beginnin
23710 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a  g for eOp==2 */.
23720 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
23730 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
23740 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   = pCur->info.pP
23750 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53  ayload;.#ifdef S
23760 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
23770 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e  RFLOW_READ.  bEn
23780 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d  d = offset+amt==
23790 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
237a0 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  oad;.#endif.  as
237b0 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
237c0 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
237d0 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66  Payload );..  if
237e0 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  ( &aPayload[pCur
237f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
23800 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
23810 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20  Bt->usableSize] 
23820 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
23830 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
23840 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
23850 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
23860 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
23870 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
23880 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
23890 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
238a0 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
238b0 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
238c0 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
238d0 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
238e0 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
238f0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
23900 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
23910 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
23920 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
23930 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
23940 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
23950 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
23960 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
23970 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
23980 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28  set], pBuf, a, (
23990 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50 61  eOp & 0x01), pPa
239a0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
239b0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
239c0 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
239d0 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
239e0 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
239f0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
23a00 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28  cal;.  }...  if(
23a10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
23a20 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
23a30 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
23a40 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
23a50 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
23a60 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
23a70 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
23a80 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
23a90 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
23aa0 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
23ab0 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
23ac0 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  cal]);..    /* I
23ad0 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  f the BtCursor.a
23ae0 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e  Overflow[] has n
23af0 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
23b00 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
23b10 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70  ow..    ** Excep
23b20 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61  t, do not alloca
23b30 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66  te aOverflow[] f
23b40 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a  or eOp==2..    *
23b50 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76  *.    ** The aOv
23b60 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69  erflow[] array i
23b70 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65  s sized at one e
23b80 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
23b90 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
23ba0 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ** in the overfl
23bb0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
23bc0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
23bd0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
23be0 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73  page is.    ** s
23bf0 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
23c00 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61  ow[0], etc. A va
23c10 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
23c20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
23c30 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22  y.    ** means "
23c40 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28  not yet known" (
23c50 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
23c60 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
23c70 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
23c80 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e  Op!=2 && (pCur->
23c90 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
23ca0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b  ValidOvfl)==0 ){
23cb0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c  .      int nOvfl
23cc0 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   = (pCur->info.n
23cd0 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e  Payload-pCur->in
23ce0 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69  fo.nLocal+ovflSi
23cf0 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a  ze-1)/ovflSize;.
23d00 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e        if( nOvfl>
23d10 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63  pCur->nOvflAlloc
23d20 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
23d30 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29   *aNew = (Pgno*)
23d40 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a  sqlite3Realloc(.
23d50 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
23d60 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76  ->aOverflow, nOv
23d70 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f  fl*2*sizeof(Pgno
23d80 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
23d90 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
23da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
23db0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
23dc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
23dd0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
23de0 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76  nOvflAlloc = nOv
23df0 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  fl*2;.          
23e00 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
23e10 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
23e20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23e30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23e40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  K ){.        mem
23e50 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
23e60 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
23e70 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
23e80 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
23e90 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
23ea0 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  dOvfl;.      }. 
23eb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
23ec0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
23ed0 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
23ee0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
23ef0 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
23f00 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
23f10 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
23f20 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
23f30 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
23f40 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
23f50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
23f60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
23f70 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
23f80 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72  !=0.     && pCur
23f90 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
23fa0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20  et/ovflSize].   
23fb0 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
23fc0 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
23fd0 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
23fe0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
23ff0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
24000 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
24010 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
24020 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20    }..    for( ; 
24030 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24040 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
24050 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20  ge; iIdx++){..  
24060 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
24070 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
24080 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
24090 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
240a0 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
240b0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
240c0 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a  alidOvfl)!=0 ){.
240d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
240e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
240f0 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
24100 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
24110 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
24120 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
24130 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
24140 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
24150 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
24160 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
24170 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
24180 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
24190 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
241a0 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
241b0 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
241c0 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
241d0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
241e0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
241f0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
24200 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
24210 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
24220 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
24230 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
24240 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
24250 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
24260 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
24270 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
24280 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
24290 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
242a0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
242b0 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76  ote that the aOv
242c0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
242d0 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
242e0 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a   because eOp!=2.
242f0 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e          ** here.
24300 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65    If eOp==2, the
24310 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20  n offset==0 and 
24320 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e  this branch is n
24330 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20  ever taken..    
24340 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
24350 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b  ssert( eOp!=2 );
24360 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
24370 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
24380 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
24390 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
243a0 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
243b0 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
243c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
243d0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
243e0 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
243f0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
24400 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
24410 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
24420 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
24430 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
24440 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
24450 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
24460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24470 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
24480 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
24490 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
244a0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
244b0 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
244c0 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
244d0 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
244e0 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
244f0 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
24500 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
24510 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
24520 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
24530 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
24540 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
24550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24560 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69  _file *fd;.#endi
24570 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
24580 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
24590 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
245a0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
245b0 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
245c0 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
245d0 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
245e0 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
245f0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
24600 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
24610 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
24620 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
24630 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
24640 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
24650 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
24660 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
24670 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
24680 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
24690 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
246a0 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
246b0 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61    **   3) the da
246c0 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62  tabase is file-b
246d0 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20  acked, and.     
246e0 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65     **   4) there
246f0 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74   is no open writ
24700 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e-transaction, a
24710 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
24720 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  5) the database 
24730 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74  is not a WAL dat
24740 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a  abase,.        *
24750 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20  *   6) all data 
24760 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73  from the page is
24770 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20   being read..   
24780 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20       **   7) at 
24790 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
247a0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
247b0 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
247c0 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
247d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
247e0 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
247f0 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
24800 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
24810 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
24820 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
24830 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
24840 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
24850 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
24860 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
24870 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
24880 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
24890 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
248a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
248b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
248c0 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31     if( (eOp&0x01
248d0 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )==0            
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
24900 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
24910 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24940 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
24950 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c        && (bEnd |
24960 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20  | a==ovflSize)  
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
24990 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  6) */.         &
249a0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
249b0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44  tion==TRANS_READ
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
249e0 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d          && (fd =
249f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
24a00 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d  e(pBt->pPager))-
24a10 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a  >pMethods     /*
24a20 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
24a30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
24a40 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31  >aData[19]==0x01
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f         /* (5) */
24a70 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42  .         && &pB
24a80 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72  uf[-4]>=pBufStar
24a90 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ab0 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20  /* (7) */.      
24ac0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
24ad0 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
24ae0 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
24af0 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
24b00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
24b10 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72  aWrite>=pBufStar
24b20 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  t );            
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b40 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20  hence (7) */.   
24b50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53         memcpy(aS
24b60 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b  ave, aWrite, 4);
24b70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24b80 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
24b90 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28  , aWrite, a+4, (
24ba0 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  i64)pBt->pageSiz
24bb0 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b  e*(nextPage-1));
24bc0 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
24bd0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
24be0 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
24bf0 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c    memcpy(aWrite,
24c00 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20   aSave, 4);.    
24c10 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
24c20 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ..        {.    
24c30 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
24c40 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  bPage;.         
24c50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24c60 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
24c70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
24c80 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20   &pDbPage,.     
24c90 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30           ((eOp&0
24ca0 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f  x01)==0 ? PAGER_
24cb0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
24cc0 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
24cd0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
24ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24cf0 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
24d00 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
24d10 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
24d20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
24d30 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
24d40 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
24d50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
24d60 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
24d70 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
24d80 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78  pBuf, a, (eOp&0x
24d90 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20  01), pDbPage);. 
24da0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
24db0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
24dc0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24dd0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
24de0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24df0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74     }.        amt
24e00 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70   -= a;.        p
24e10 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
24e20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
24e30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24e40 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
24e50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
24e60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24e70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24e80 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
24e90 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f   of the key asso
24ea0 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73  ciated with curs
24eb0 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c  or pCur.  Exactl
24ec0 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73  y.** "amt" bytes
24ed0 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65   will be transfe
24ee0 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  rred into pBuf[]
24ef0 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
24f00 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
24f10 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  fset"..**.** The
24f20 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
24f30 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73  ure that pCur is
24f40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76   pointing to a v
24f50 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74  alid row.** in t
24f60 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
24f70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
24f80 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
24f90 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
24fa0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
24fb0 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
24fc0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
24fd0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
24fe0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
24ff0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
25000 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
25010 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74  lite3BtreeKey(Bt
25020 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
25030 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
25040 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
25050 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25060 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25070 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25080 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25090 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
250a0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
250b0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
250c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
250d0 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
250e0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
250f0 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
25100 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
25110 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
25120 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
25130 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
25140 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
25150 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
25160 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
25170 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
25180 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
25190 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
251a0 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
251b0 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
251c0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
251d0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
251e0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
251f0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
25200 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
25210 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
25220 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
25230 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
25240 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
25250 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
25260 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
25270 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
25280 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
25290 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
252a0 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
252b0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
252c0 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
252d0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
252e0 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
252f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
25300 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
25310 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25320 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
25330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25340 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
25350 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
25360 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25370 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
25380 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
25390 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
253a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
253b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
253c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
253d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
253e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
253f0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
25400 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25410 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
25420 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
25430 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
25440 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25450 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
25460 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
25470 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
25480 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
25490 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
254a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
254b0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
254c0 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
254d0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
254e0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
254f0 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
25500 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
25510 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
25520 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
25530 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
25540 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70   index btrees (p
25550 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29  Page->intKey==0)
25560 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61   and is the data
25570 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74   for.** table bt
25580 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
25590 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d  Key==1). The num
255a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
255b0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79  available.** key
255c0 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
255d0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
255e0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
255f0 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74  the value.** ret
25600 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
25610 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  e a valid pointe
25620 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
25630 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
25640 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
25650 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
25660 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
25670 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
25680 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
25690 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
256a0 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
256b0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
256c0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
256d0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
256e0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
256f0 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
25700 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
25710 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
25720 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
25730 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
25740 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
25750 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
25760 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
25770 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
25780 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
25790 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
257a0 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
257b0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
257c0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
257d0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
257e0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
257f0 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
25800 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
25810 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
25820 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
25830 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
25840 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
25850 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
25860 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
25870 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66  ic const void *f
25880 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
25890 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
258a0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
258b0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
258c0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
258d0 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20    u32 *pAmt     
258e0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
258f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
25900 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
25910 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  re */.){.  asser
25920 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
25930 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
25940 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25950 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
25960 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
25970 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
25980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
25990 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
259a0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
259b0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
259c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
259d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
259e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
259f0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
25a00 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
25a10 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
25a20 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
25a30 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
25a40 7a 65 3e 30 20 29 3b 0a 20 20 2a 70 41 6d 74 20  ze>0 );.  *pAmt 
25a50 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
25a60 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  cal;.  return (v
25a70 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  oid*)pCur->info.
25a80 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  pPayload;.}.../*
25a90 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
25aa0 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
25ab0 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
25ac0 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
25ad0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
25ae0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
25af0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
25b00 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
25b10 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
25b20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
25b30 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
25b40 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
25b50 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
25b60 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
25b70 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
25b80 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
25b90 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
25ba0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
25bb0 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
25bc0 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
25bd0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
25be0 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
25bf0 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
25c00 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
25c10 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
25c20 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
25c30 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
25c40 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
25c50 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
25c60 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
25c70 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
25c80 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
25c90 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
25ca0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
25cb0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
25cc0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
25cd0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
25ce0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
25cf0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
25d00 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
25d10 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
25d20 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
25d30 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
25d40 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
25d50 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
25d60 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
25d70 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
25d80 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
25d90 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
25da0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
25db0 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
25dc0 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
25dd0 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
25de0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
25df0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
25e00 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
25e10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
25e20 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
25e30 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
25e40 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
25e50 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
25e60 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
25e70 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
25e80 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
25e90 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
25ea0 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
25eb0 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
25ec0 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
25ed0 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
25ee0 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
25ef0 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
25f00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
25f10 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
25f20 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
25f30 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Pgno){.  int rc;
25f40 0a 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d  .  int i = pCur-
25f50 3e 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67  >iPage;.  MemPag
25f60 65 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42  e *pNewPage;.  B
25f70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
25f80 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
25f90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25fa0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25fb0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
25fc0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25fd0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
25fe0 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43   pCur->iPage<BTC
25ff0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20  URSOR_MAX_DEPTH 
26000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26010 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  r->iPage>=0 );. 
26020 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
26030 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
26040 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
26050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26060 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
26070 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
26080 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
26090 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 0a 20  no, &pNewPage,. 
260a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
260b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
260c0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
260d0 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
260e0 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
260f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
26100 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61  rc;.  pCur->apPa
26110 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61  ge[i+1] = pNewPa
26120 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64  ge;.  pCur->aiId
26130 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43  x[i+1] = 0;.  pC
26140 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20  ur->iPage++;..  
26150 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
26160 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
26170 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
26180 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
26190 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66  ValidOvfl);.  if
261a0 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
261b0 6c 3c 31 20 7c 7c 20 70 4e 65 77 50 61 67 65 2d  l<1 || pNewPage-
261c0 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e 61  >intKey!=pCur->a
261d0 70 50 61 67 65 5b 69 5d 2d 3e 69 6e 74 4b 65 79  pPage[i]->intKey
261e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
261f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
26200 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
26210 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
26220 69 66 20 30 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  if 0./*.** Page 
26230 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
26240 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
26250 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
26260 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
26270 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
26280 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
26290 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
262a0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
262b0 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
262c0 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
262d0 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
262e0 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
262f0 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
26300 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
26310 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
26320 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
26330 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
26340 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
26350 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
26360 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
26370 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
26380 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
26390 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
263a0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
263b0 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
263c0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
263d0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
263e0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
263f0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
26400 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
26410 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
26420 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
26430 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
26440 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
26450 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
26460 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
26470 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
26480 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
26490 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
264a0 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
264b0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
264c0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
264d0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
264e0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
264f0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
26500 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
26510 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
26520 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
26530 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
26540 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
26550 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
26560 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
26570 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
26580 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
26590 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
265a0 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
265b0 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
265c0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
265d0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
265e0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
265f0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
26600 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
26610 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
26620 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
26630 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
26640 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26650 5d 20 29 3b 0a 0a 20 20 2f 2a 20 55 50 44 41 54  ] );..  /* UPDAT
26660 45 3a 20 49 74 20 69 73 20 61 63 74 75 61 6c 6c  E: It is actuall
26670 79 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  y possible for t
26680 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 74 65 73  he condition tes
26690 74 65 64 20 62 79 20 74 68 65 20 61 73 73 65 72  ted by the asser
266a0 74 0a 20 20 2a 2a 20 62 65 6c 6f 77 20 74 6f 20  t.  ** below to 
266b0 62 65 20 75 6e 74 72 75 65 20 69 66 20 74 68 65  be untrue if the
266c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
266d0 73 20 63 6f 72 72 75 70 74 2e 20 54 68 69 73 20  s corrupt. This 
266e0 63 61 6e 20 6f 63 63 75 72 20 69 66 0a 20 20 2a  can occur if.  *
266f0 2a 20 6f 6e 65 20 63 75 72 73 6f 72 20 68 61 73  * one cursor has
26700 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65 20 70   modified page p
26710 50 61 72 65 6e 74 20 77 68 69 6c 65 20 61 20 72  Parent while a r
26720 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69  eference to it i
26730 73 20 68 65 6c 64 20 0a 20 20 2a 2a 20 62 79 20  s held .  ** by 
26740 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 2e  a second cursor.
26750 20 57 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20   Which can only 
26760 68 61 70 70 65 6e 20 69 66 20 61 20 73 69 6e 67  happen if a sing
26770 6c 65 20 70 61 67 65 20 69 73 20 6c 69 6e 6b 65  le page is linke
26780 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 6d 6f 72 65  d.  ** into more
26790 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
267a0 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 61 20   structure in a 
267b0 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
267c0 2e 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  .  */.#if 0.  as
267d0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
267e0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
267f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
26800 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
26810 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
26820 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
26830 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
26840 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 23 65 6e  ]->pgno.  );.#en
26850 64 69 66 0a 20 20 74 65 73 74 63 61 73 65 28 20  dif.  testcase( 
26860 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
26870 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
26880 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
26890 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
268a0 29 3b 0a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  );..  releasePag
268b0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  e(pCur->apPage[p
268c0 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20  Cur->iPage]);.  
268d0 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
268e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
268f0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
26900 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
26910 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
26920 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 7d 0a 0a  _ValidOvfl);.}..
26930 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
26940 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
26950 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
26960 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
26970 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
26980 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
26990 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
269a0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
269b0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
269c0 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
269d0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
269e0 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
269f0 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
26a00 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
26a10 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
26a20 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
26a30 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
26a40 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
26a50 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
26a60 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
26a70 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
26a80 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
26a90 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
26aa0 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
26ab0 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
26ac0 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
26ad0 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
26ae0 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
26af0 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
26b00 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
26b10 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
26b20 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
26b30 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
26b40 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
26b50 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
26b60 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
26b70 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
26b80 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
26b90 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
26ba0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
26bb0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
26bc0 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
26bd0 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
26be0 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
26bf0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
26c00 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
26c10 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
26c20 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
26c30 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
26c40 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
26c50 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
26c60 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
26c70 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
26c80 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
26c90 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
26ca0 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
26cb0 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
26cc0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
26cd0 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
26ce0 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
26cf0 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
26d00 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
26d10 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
26d20 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
26d30 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
26d40 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
26d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26d60 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
26d70 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
26d80 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
26d90 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26da0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
26db0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26dc0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
26dd0 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
26de0 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
26df0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
26e00 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
26e10 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
26e20 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
26e30 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
26e40 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
26e50 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
26e60 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
26e70 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
26e80 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
26e90 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
26ea0 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
26eb0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26ec0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
26ed0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74  _OK );.      ret
26ee0 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
26ef0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  xt;.    }.    sq
26f00 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
26f10 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d  ursor(pCur);.  }
26f20 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ..  if( pCur->iP
26f30 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68  age>=0 ){.    wh
26f40 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ile( pCur->iPage
26f50 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 28 70   ) releasePage(p
26f60 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
26f70 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 7d  ->iPage--]);.  }
26f80 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70  else if( pCur->p
26f90 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20  gnoRoot==0 ){.  
26fa0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
26fb0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
26fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26fd0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
26fe0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
26ff0 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42  nitPage(pCur->pB
27000 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d  tree->pBt, pCur-
27010 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72  >pgnoRoot, &pCur
27020 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20  ->apPage[0],.   
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70                (p
27040 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
27050 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d  BTCF_WriteFlag)=
27060 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
27070 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
27080 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
27090 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
270a0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
270b0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
270c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
270d0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
270e0 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 52  ge = 0;.  }.  pR
270f0 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
27100 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
27110 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
27120 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
27130 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70  .  /* If pCur->p
27140 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e  KeyInfo is not N
27150 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61  ULL, then the ca
27160 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64  ller that opened
27170 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a   this cursor.  *
27180 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70  * expected to op
27190 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65  en it on an inde
271a0 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77  x b-tree. Otherw
271b0 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f  ise, if pKeyInfo
271c0 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74   is.  ** NULL, t
271d0 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74  he caller expect
271e0 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  s a table b-tree
271f0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
27200 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20   the case,.  ** 
27210 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
27220 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20  _CORRUPT error. 
27230 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69  .  **.  ** Earli
27240 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
27250 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68  QLite assumed th
27260 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75  at this test cou
27270 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a  ld not fail.  **
27280 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67   if the root pag
27290 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f  e was already lo
272a0 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  aded when this f
272b0 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c  unction was call
272c0 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66  ed (i.e..  ** if
272d0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29   pCur->iPage>=0)
272e0 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f  . But this is no
272f0 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61  t so if the data
27300 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65  base is corrupte
27310 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20  d .  ** in such 
27320 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20  a way that page 
27330 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20  pRoot is linked 
27340 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d  into a second b-
27350 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a  tree table .  **
27360 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73   (or the freelis
27370 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t).  */.  assert
27380 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  ( pRoot->intKey=
27390 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74  =1 || pRoot->int
273a0 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Key==0 );.  if( 
273b0 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30  pRoot->isInit==0
273c0 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49   || (pCur->pKeyI
273d0 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e  nfo==0)!=pRoot->
273e0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
273f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
27400 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
27410 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20   pCur->aiIdx[0] 
27420 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
27430 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
27440 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
27450 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
27460 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
27470 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a  CF_ValidOvfl);..
27480 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65    if( pRoot->nCe
27490 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ll>0 ){.    pCur
274a0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
274b0 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65  R_VALID;.  }else
274c0 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61   if( !pRoot->lea
274d0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
274e0 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
274f0 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
27500 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27510 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
27520 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62 79  subpage = get4by
27530 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61  te(&pRoot->aData
27540 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65  [pRoot->hdrOffse
27550 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
27560 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27570 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d  _VALID;.    rc =
27580 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
27590 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d  r, subpage);.  }
275a0 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e  else{.    pCur->
275b0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
275c0 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72  INVALID;.  }.  r
275d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
275e0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
275f0 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
27600 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
27610 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
27620 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
27630 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
27640 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
27650 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
27660 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
27670 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
27680 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
27690 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
276a0 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
276b0 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
276c0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
276d0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
276e0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
276f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
27700 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
27710 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
27720 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
27730 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27740 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27750 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
27760 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27770 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
27780 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27790 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
277a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
277b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
277c0 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
277d0 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  ll );.    pgno =
277e0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
277f0 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
27800 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27810 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  e]));.    rc = m
27820 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
27830 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65   pgno);.  }.  re
27840 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27850 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
27860 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69  r down to the ri
27870 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  ght-most leaf en
27880 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
27890 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68  ** page to which
278a0 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
278b0 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69   pointing.  Noti
278c0 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  ce the differenc
278d0 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76  e.** between mov
278e0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e  eToLeftmost() an
278f0 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  d moveToRightmos
27900 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74  t().  moveToLeft
27910 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
27920 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e  the left-most en
27930 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
27940 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20  *entry* whereas 
27950 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
27960 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72  ).** finds the r
27970 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
27980 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67  beneath the *pag
27990 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69  e*..**.** The ri
279a0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69  ght-most entry i
279b0 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
279c0 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d  he largest key -
279d0 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79   the last.** key
279e0 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
279f0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
27a00 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nt moveToRightmo
27a10 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
27a20 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  r){.  Pgno pgno;
27a30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27a40 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
27a50 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20   *pPage = 0;..  
27a60 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
27a70 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
27a80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27a90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27aa0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
27ab0 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  e( !(pPage = pCu
27ac0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
27ad0 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b  iPage])->leaf ){
27ae0 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
27af0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
27b00 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
27b10 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
27b20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27b30 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
27b40 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
27b50 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
27b60 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
27b70 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
27b80 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64    }.  pCur->aiId
27b90 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
27ba0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
27bb0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27bc0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
27bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
27be0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
27bf0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
27c00 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
27c10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
27c20 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
27c30 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
27c40 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
27c50 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27c60 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
27c70 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
27c80 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
27c90 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
27ca0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
27cb0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
27cc0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
27cd0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
27ce0 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
27cf0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27d00 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
27d10 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
27d20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27d30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27d40 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
27d50 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
27d60 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
27d70 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
27d80 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
27d90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27da0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
27db0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27dc0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
27dd0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27de0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
27df0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27e00 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
27e10 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
27e20 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
27e30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
27e40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27e50 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27e60 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  >0 );.      *pRe
27e70 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
27e80 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
27e90 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
27ea0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27eb0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
27ec0 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
27ed0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
27ee0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
27ef0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
27f00 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
27f10 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
27f20 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
27f30 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
27f40 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
27f50 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
27f60 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
27f70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
27f80 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
27f90 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
27fa0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
27fb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
27fc0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
27fd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
27fe0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
27ff0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
28000 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
28010 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c  If the cursor al
28020 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20  ready points to 
28030 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20  the last entry, 
28040 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
28050 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52   */.  if( CURSOR
28060 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
28070 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63  tate && (pCur->c
28080 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41  urFlags & BTCF_A
28090 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66  tLast)!=0 ){.#if
280a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
280b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
280c0 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
280d0 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
280e0 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
280f0 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
28100 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
28110 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
28120 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
28130 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
28140 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
28150 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
28160 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
28170 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
28180 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
28190 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
281a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
281b0 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d  r->iPage]==pCur-
281c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
281d0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
281e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
281f0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28200 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
28210 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
28220 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
28230 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
28240 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
28250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28260 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
28270 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
28280 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
28290 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
282a0 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
282b0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
282c0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
282d0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
282e0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
282f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28300 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28310 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
28320 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
28330 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
28340 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
28350 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28370 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
28380 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b   |= BTCF_AtLast;
28390 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
283a0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
283b0 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74  lags &= ~BTCF_At
283c0 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Last;.      }.  
283d0 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65   .    }.  }.  re
283e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
283f0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
28400 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
28410 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
28420 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
28430 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78 4b  ecified by pIdxK
28440 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20  ey or intKey.   
28450 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73  Return a success
28460 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   code..**.** For
28470 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20   INTKEY tables, 
28480 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d  the intKey param
28490 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
284a0 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20  IdxKey .** must 
284b0 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e  be NULL.  For in
284c0 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78  dex tables, pIdx
284d0 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64 20  Key is used and 
284e0 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e  intKey.** is ign
284f0 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ored..**.** If a
28500 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
28510 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e   not found, then
28520 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
28530 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f  lways.** left po
28540 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66  inting at a leaf
28550 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c   page which woul
28560 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79  d hold the entry
28570 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70   if it.** were p
28580 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72  resent.  The cur
28590 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  sor might point 
285a0 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  to an entry that
285b0 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65   comes.** before
285c0 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65   or after the ke
285d0 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65  y..**.** An inte
285e0 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 69  ger is written i
285f0 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20  nto *pRes which 
28600 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  is the result of
28610 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  .** comparing th
28620 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
28630 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
28640 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20  e cursor is .** 
28650 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d  pointing.  The m
28660 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  eaning of the in
28670 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e  teger written in
28680 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61  to.** *pRes is a
28690 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
286a0 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20       *pRes<0    
286b0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
286c0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
286d0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
286e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
286f0 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68     is smaller th
28700 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
28710 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c  y or if the tabl
28720 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20  e is empty.**   
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
28740 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  nd the cursor is
28750 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20   therefore left 
28760 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67  point to nothing
28770 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  ..**.**     *pRe
28780 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75 72  s==0     The cur
28790 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
287a0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
287b0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
287c0 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74 6c            exactl
287d0 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79  y matches intKey
287e0 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
287f0 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20      *pRes>0     
28800 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c   The cursor is l
28810 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
28820 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a  an entry that.**
28830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28840 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e    is larger than
28850 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
28860 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .**.*/.int sqlit
28870 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
28880 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
28890 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
288a0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
288b0 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
288c0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
288d0 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
288e0 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
288f0 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
28900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28910 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
28920 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
28930 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
28940 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
28950 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
28960 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
28970 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
28980 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
28990 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
289a0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
289b0 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70  rc;.  RecordComp
289c0 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  are xRecordCompa
289d0 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  re;..  assert( c
289e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
289f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28a00 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28a10 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
28a20 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
28a30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
28a40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
28a50 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
28a60 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20  r->pKeyInfo==0) 
28a70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
28a80 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
28a90 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
28aa0 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
28ab0 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
28ac0 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
28ad0 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
28ae0 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
28af0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
28b00 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
28b10 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
28b20 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
28b30 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 20  alidNKey)!=0.   
28b40 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
28b50 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
28b60 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
28b70 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
28b80 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
28b90 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
28ba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
28bb0 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72   }.    if( (pCur
28bc0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
28bd0 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20  F_AtLast)!=0 && 
28be0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c  pCur->info.nKey<
28bf0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
28c00 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
28c10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28c20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
28c30 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a   if( pIdxKey ){.
28c40 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61      xRecordCompa
28c50 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  re = sqlite3Vdbe
28c60 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78  FindCompare(pIdx
28c70 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  Key);.    pIdxKe
28c80 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  y->errCode = 0;.
28c90 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
28ca0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
28cb0 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =1 .         || 
28cc0 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
28cd0 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  _rc==0 .        
28ce0 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66   || pIdxKey->def
28cf0 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20  ault_rc==-1.    
28d00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28d10 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
28d20 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20   0; /* All keys 
28d30 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a  are integers */.
28d40 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
28d50 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
28d60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
28d70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
28d80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
28d90 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
28da0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28db0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
28dc0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
28dd0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
28de0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28df0 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  ]->isInit );.  a
28e00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
28e10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
28e20 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  LID || pCur->apP
28e30 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28e40 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69  ->nCell>0 );.  i
28e50 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
28e60 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
28e70 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  ){.    *pRes = -
28e80 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
28e90 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
28ea0 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
28eb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
28ec0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Cell==0 );.    r
28ed0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
28ee0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
28ef0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
28f00 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65  intKey || pIdxKe
28f10 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a  y );.  for(;;){.
28f20 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72      int lwr, upr
28f30 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67  , idx, c;.    Pg
28f40 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
28f50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
28f60 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28f70 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75  r->iPage];.    u
28f80 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
28f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fa0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
28fb0 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
28fc0 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f   pPage */..    /
28fd0 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d  * pPage->nCell m
28fe0 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
28ff0 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69  han zero. If thi
29000 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  s is the root-pa
29010 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ge.    ** the cu
29020 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20  rsor would have 
29030 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f  been INVALID abo
29040 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28  ve and this for(
29050 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20  ;;) loop.    ** 
29060 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73  not run. If this
29070 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
29080 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20  -page, then the 
29090 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f  moveToChild() ro
290a0 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75  utine.    ** wou
290b0 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
290c0 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72  detected db corr
290d0 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c  uption. Similarl
290e0 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20  y, pPage must.  
290f0 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68    ** be the righ
29100 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72  t kind (index or
29110 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65   table) of b-tre
29120 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  e page. Otherwis
29130 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54  e.    ** a moveT
29140 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65  oChild() or move
29150 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f  ToRoot() call wo
29160 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
29170 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  d corruption.  *
29180 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
29190 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
291a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
291b0 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78  e->intKey==(pIdx
291c0 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c  Key==0) );.    l
291d0 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
291e0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
291f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69  ;.    assert( bi
29200 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69  asRight==0 || bi
29210 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20  asRight==1 );.  
29220 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d    idx = upr>>(1-
29230 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69  biasRight); /* i
29240 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f  dx = biasRight ?
29250 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29   upr : (lwr+upr)
29260 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  /2; */.    pCur-
29270 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29280 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
29290 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43      if( xRecordC
292a0 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20  ompare==0 ){.   
292b0 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
292c0 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
292d0 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
292e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
292f0 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
29300 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
29310 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
29320 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
29330 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
29340 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
29350 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
29360 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
29370 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72  ge->aDataEnd ) r
29380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
29390 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
293a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
293b0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
293c0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
293d0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
293e0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
293f0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
29400 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
29410 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29420 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
29430 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
29440 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
29450 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
29460 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
29470 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
29480 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
29490 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
294a0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
294b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
294c0 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
294d0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
294e0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
294f0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
29500 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
29510 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
29520 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
29530 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
29540 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
29550 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
29560 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
29570 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
29580 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
29590 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
295a0 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b  veto_next_layer;
295b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
295c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
295d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
295e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
295f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
29600 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
29610 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
29620 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
29630 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
29640 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
29650 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
29660 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
29670 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
29680 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
29690 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
296a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
296b0 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c  ll;.        pCel
296c0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
296d0 67 65 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65  ge, idx) + pPage
296e0 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
296f0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
29700 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
29710 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
29720 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
29730 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
29740 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
29750 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
29760 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
29770 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
29780 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
29790 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
297a0 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
297b0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
297c0 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
297d0 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
297e0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
297f0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
29800 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
29810 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
29820 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
29830 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
29840 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
29850 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
29860 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
29870 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
29880 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
29890 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
298a0 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
298b0 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
298c0 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
298d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
298e0 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
298f0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
29900 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
29910 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
29920 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
29930 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
29940 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
29950 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
29960 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
29970 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
29980 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
29990 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
299a0 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
299b0 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
299c0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
299d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
299e0 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
299f0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
29a00 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
29a10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
29a20 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
29a30 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
29a40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
29a50 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
29a60 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
29a70 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
29a80 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
29a90 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
29aa0 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
29ab0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
29ac0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
29ad0 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
29ae0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
29af0 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
29b00 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
29b10 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
29b20 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
29b30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
29b40 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
29b50 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
29b60 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
29b70 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
29b80 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
29b90 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
29ba0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
29bb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
29bc0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
29bd0 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
29be0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
29bf0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
29c00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
29c10 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
29c20 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
29c30 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
29c40 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
29c50 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
29c60 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
29c70 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
29c80 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
29c90 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
29ca0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
29cb0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
29cc0 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
29cd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
29ce0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
29cf0 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
29d00 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
29d10 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
29d20 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
29d30 20 20 20 20 20 20 62 74 72 65 65 50 61 72 73 65        btreeParse
29d40 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
29d50 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
29d60 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
29d70 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
29d80 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
29d90 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
29da0 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
29db0 6f 63 28 20 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  oc( nCell );.   
29dc0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
29dd0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
29de0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
29df0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
29e00 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
29e10 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
29e20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
29e30 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29e40 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
29e50 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  dx;.          rc
29e60 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   = accessPayload
29e70 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c  (pCur, 0, nCell,
29e80 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
29e90 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20  )pCellKey, 2);. 
29ea0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
29eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
29ec0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
29ed0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
29ee0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
29ef0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
29f00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
29f10 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
29f20 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
29f30 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
29f40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
29f50 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
29f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
29f70 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20 20  ssert( .        
29f80 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72      (pIdxKey->er
29f90 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f  rCode!=SQLITE_CO
29fa0 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20  RRUPT || c==0). 
29fb0 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64 78          && (pIdx
29fc0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
29fd0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43  LITE_NOMEM || pC
29fe0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
29ff0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20  mallocFailed).  
2a000 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
2a010 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
2a020 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b        lwr = idx+
2a030 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2a040 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20   if( c>0 ){.    
2a050 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2a060 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2a070 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
2a080 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20  rt( c==0 );.    
2a090 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2a0a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a0b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2a0c0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2a0d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2a0e0 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2a0f0 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d      if( pIdxKey-
2a100 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20  >errCode ) rc = 
2a110 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2a120 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2a130 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2a140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a150 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72  if( lwr>upr ) br
2a160 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73  eak;.        ass
2a170 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2a180 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2a190 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2a1a0 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2a1b0 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  r)/2 */.      }.
2a1c0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2a1d0 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20  ( lwr==upr+1 || 
2a1e0 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  (pPage->intKey &
2a1f0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20  & !pPage->leaf) 
2a200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2a210 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2a220 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
2a230 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73  eaf ){.      ass
2a240 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2a250 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
2a260 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a270 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
2a280 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69  ;.      pCur->ai
2a290 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2a2a0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2a2b0 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20     *pRes = c;.  
2a2c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a2d0 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
2a2e0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2a2f0 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f    }.moveto_next_
2a300 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c  layer:.    if( l
2a310 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
2a320 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
2a330 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2a340 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2a350 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2a360 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a370 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
2a380 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2a390 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
2a3a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2a3b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2a3c0 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20  u16)lwr;.    rc 
2a3d0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2a3e0 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
2a3f0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
2a400 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69  .  }.moveto_fini
2a410 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  sh:.  pCur->info
2a420 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2a430 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2a440 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2a450 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2a460 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2a470 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
2a480 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
2a490 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
2a4a0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
2a4b0 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
2a4c0 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
2a4d0 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
2a4e0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
2a4f0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
2a500 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
2a510 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2a520 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
2a530 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
2a540 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
2a550 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
2a560 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
2a570 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
2a580 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2a590 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
2a5a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2a5b0 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
2a5c0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2a5d0 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
2a5e0 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
2a5f0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
2a600 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
2a610 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
2a620 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
2a630 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
2a640 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
2a650 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
2a660 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
2a670 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
2a680 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
2a690 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
2a6a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2a6b0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2a6c0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2a6d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2a6e0 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2a6f0 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2a700 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2a710 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2a720 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2a730 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2a740 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
2a750 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ore.** this rout
2a760 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20  ine was called, 
2a770 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31  then set *pRes=1
2a780 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  ..**.** The main
2a790 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
2a7a0 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2a7b0 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
2a7c0 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
2a7d0 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
2a7e0 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
2a7f0 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
2a800 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
2a810 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
2a820 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65 6c 6c  to the next cell
2a830 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2a840 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2a850 65 72 29 20 62 74 72 65 65 4e 65 78 74 28 29 20  er) btreeNext() 
2a860 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e  helper.** routin
2a870 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
2a880 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   it is necessary
2a890 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69   to move to a di
2a8a0 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f 72 0a  fferent page or.
2a8b0 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ** to restore th
2a8c0 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  e cursor..**.** 
2a8d0 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  The calling func
2a8e0 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70  tion will set *p
2a8f0 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20 20  Res to 0 or 1.  
2a900 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  The initial *pRe
2a910 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  s value.** will 
2a920 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72 73  be 1 if the curs
2a930 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65 64  or being stepped
2a940 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
2a950 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
2a960 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75 74  .** if this rout
2a970 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ine could have b
2a980 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20 74  een skipped if t
2a990 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68 61  hat SQL index ha
2a9a0 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71  d been.** a uniq
2a9b0 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65 72  ue index.  Other
2a9c0 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20  wise the caller 
2a9d0 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a 70  will have set *p
2a9e0 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20  Res to zero..** 
2a9f0 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d  Zero is the comm
2aa00 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74 72  on case. The btr
2aa10 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2aa20 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73 65  n is free to use
2aa30 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20   the.** initial 
2aa40 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20 61  *pRes value as a
2aa50 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65   hint to improve
2aa60 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75   performance, bu
2aa70 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
2aa80 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d   SQLite btree im
2aa90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2aaa0 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61  s not. (Note tha
2aab0 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74 72  t the comdb2 btr
2aac0 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ee.** implementa
2aad0 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74 68  tion does use th
2aae0 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65 72  is hint, however
2aaf0 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  .).*/.static SQL
2ab00 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2ab10 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2ab20 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2ab30 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
2ab40 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65  .  int idx;.  Me
2ab50 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2ab60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2ab70 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2ab80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2ab90 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2aba0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2abb0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2abc0 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2abd0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2abe0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2abf0 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73  _VALID ){.    as
2ac00 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
2ac10 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2ac20 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20  idOvfl)==0 );.  
2ac30 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2ac40 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2ac50 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2ac60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ac70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2ac80 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2ac90 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2aca0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2acb0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2acc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2acd0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2ace0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2acf0 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2ad00 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2ad10 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2ad20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2ad30 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2ad40 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2ad50 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2ad60 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2ad70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20  Cur->skipNext>0 
2ad80 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2ad90 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2ada0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2adb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2adc0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2add0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2ade0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2adf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2ae00 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78  r->iPage];.  idx
2ae10 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
2ae20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2ae30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ae40 69 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20  isInit );..  /* 
2ae50 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
2ae60 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c  file is corrupt,
2ae70 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
2ae80 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66  for the value of
2ae90 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65   idx .  ** to be
2aea0 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54   invalid here. T
2aeb0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
2aec0 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63  ur if a second c
2aed0 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20  ursor modifies. 
2aee0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69   ** the page whi
2aef0 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  le cursor pCur i
2af00 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65  s holding a refe
2af10 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69  rence to it. Whi
2af20 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79  ch can.  ** only
2af30 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64   happen if the d
2af40 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
2af50 70 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  pt in such a way
2af60 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a   as to link the.
2af70 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d    ** page into m
2af80 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74  ore than one b-t
2af90 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  ree structure. *
2afa0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64  /.  testcase( id
2afb0 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x>pPage->nCell )
2afc0 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  ;..  if( idx>=pP
2afd0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2afe0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2aff0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
2b000 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2b010 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
2b020 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2b030 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
2b040 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2b050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2b060 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2b070 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2b080 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
2b090 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2b0a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2b0b0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2b0c0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2b0d0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2b0e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2b0f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b100 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2b110 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2b120 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
2b130 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2b140 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c  Page];.    }whil
2b150 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2b160 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61  Cur->iPage]>=pPa
2b170 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2b180 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2b190 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
2b1a0 72 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  rn sqlite3BtreeN
2b1b0 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2b1c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
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 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2b1f0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2b200 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b210 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2b220 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2b230 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2b240 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  );.  }.}.int sql
2b250 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
2b260 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2b270 74 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50  t *pRes){.  MemP
2b280 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73  age *pPage;.  as
2b290 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2b2a0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2b2b0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2b2c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2b2d0 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
2b2e0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2b2f0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2b300 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2b310 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2b320 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2b330 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2b340 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2b350 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2b360 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2b370 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
2b380 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2b390 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2b3a0 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
2b3b0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2b3c0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2b3d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b3e0 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  ge];.  if( (++pC
2b3f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2b400 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e  iPage])>=pPage->
2b410 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
2b420 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b430 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74  Page]--;.    ret
2b440 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2b450 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2b460 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2b470 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2b480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2b490 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2b4a0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2b4b0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
2b4c0 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
2b4d0 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
2b4e0 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
2b4f0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2b500 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
2b510 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
2b520 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
2b530 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
2b540 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
2b550 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
2b560 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2b570 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2b580 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2b590 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2b5a0 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2b5b0 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2b5c0 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2b5d0 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
2b5e0 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2b5f0 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2b600 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2b610 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
2b620 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2b630 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2b640 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2b650 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
2b660 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2b670 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2b680 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
2b690 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
2b6a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2b6b0 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2b6c0 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2b6d0 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
2b6e0 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
2b6f0 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2b700 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2b710 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
2b720 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
2b730 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
2b740 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
2b750 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
2b760 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
2b770 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
2b780 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2b790 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
2b7a0 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
2b7b0 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
2b7c0 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
2b7d0 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
2b7e0 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
2b7f0 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
2b800 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
2b810 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
2b820 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
2b830 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
2b840 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2b850 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
2b860 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
2b870 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
2b880 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
2b890 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
2b8a0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
2b8b0 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
2b8c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2b8d0 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
2b8e0 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
2b8f0 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
2b900 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
2b910 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
2b920 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  r.).*/.static SQ
2b930 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2b940 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  t btreePrevious(
2b950 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2b960 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2b970 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2b980 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2b990 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2b9a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2b9b0 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2b9c0 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2b9d0 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s==0 );.  assert
2b9e0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2b9f0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2ba00 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2ba10 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  D );.  assert( (
2ba20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2ba30 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54   (BTCF_AtLast|BT
2ba40 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
2ba50 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30  F_ValidNKey))==0
2ba60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ba70 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2ba80 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2ba90 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2baa0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20  VALID ){.    rc 
2bab0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
2bac0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2bad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2baf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2bb00 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2bb10 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2bb20 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  ate ){.      *pR
2bb30 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  es = 1;.      re
2bb40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bb50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2bb60 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2bb70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2bb80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2bb90 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2bba0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2bbb0 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2bbc0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2bbd0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2bbe0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2bbf0 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20  skipNext<0 ){.  
2bc00 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2bc10 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2bc20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bc30 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2bc40 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2bc50 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2bc60 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2bc70 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2bc80 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
2bc90 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2bca0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2bcb0 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  eaf ){.    int i
2bcc0 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
2bcd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
2bce0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2bcf0 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
2bd00 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
2bd10 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69  e, idx)));.    i
2bd20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2bd30 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  c;.    rc = move
2bd40 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2bd50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2bd60 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49  while( pCur->aiI
2bd70 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d  dx[pCur->iPage]=
2bd80 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
2bd90 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2bda0 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2bdb0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2bdc0 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
2bdd0 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2bde0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bdf0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2be00 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2be10 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2be20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2be30 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
2be40 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
2be50 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2be60 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2be70 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d  TCF_ValidOvfl))=
2be80 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d  =0 );..    pCur-
2be90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2bea0 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
2beb0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2bec0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2bed0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2bee0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2bef0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
2bf00 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
2bf10 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
2bf20 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
2bf30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bf40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2bf50 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
2bf60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
2bf70 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
2bf80 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2bf90 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2bfa0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2bfb0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2bfc0 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2bfd0 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
2bfe0 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
2bff0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2c000 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2c010 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2c020 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52  R_VALID );.  *pR
2c030 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  es = 0;.  pCur->
2c040 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2c050 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2c060 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2c070 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
2c080 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2c090 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2c0a0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2c0b0 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  ID.   || pCur->a
2c0c0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c0d0 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ]==0.   || pCur-
2c0e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c0f0 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  age]->leaf==0.  
2c100 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
2c110 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2c120 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70  , pRes);.  }.  p
2c130 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2c140 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74  >iPage]--;.  ret
2c150 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c160 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2c170 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
2c180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c190 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
2c1a0 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
2c1b0 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
2c1c0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
2c1d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2c1e0 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
2c1f0 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
2c200 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
2c210 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
2c220 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
2c230 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
2c240 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
2c250 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2c260 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
2c270 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2c280 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
2c290 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
2c2a0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
2c2b0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
2c2c0 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
2c2d0 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
2c2e0 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
2c2f0 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
2c300 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61 72  ge and *pPgno ar
2c310 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  e undefined in t
2c320 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65  he event of an e
2c330 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  rror..** Do not 
2c340 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50 61  invoke sqlite3Pa
2c350 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a 70  gerUnref() on *p
2c360 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72 6f  pPage if an erro
2c370 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
2c380 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65 61  *.** If the "nea
2c390 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20 69  rby" parameter i
2c3a0 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e  s not 0, then an
2c3b0 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20   effort is made 
2c3c0 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20  to .** locate a 
2c3d0 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68  page close to th
2c3e0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e  e page number "n
2c3f0 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61  earby".  This ca
2c400 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a  n be used in an.
2c410 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65  ** attempt to ke
2c420 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73  ep related pages
2c430 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f   close to each o
2c440 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  ther in the data
2c450 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68  base file,.** wh
2c460 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20  ich in turn can 
2c470 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63  make database ac
2c480 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a  cess faster..**.
2c490 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65 20  ** If the eMode 
2c4a0 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54 41  parameter is BTA
2c4b0 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 74  LLOC_EXACT and t
2c4c0 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20 65  he nearby page e
2c4d0 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72  xists.** anywher
2c4e0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
2c4f0 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
2c500 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
2c510 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a  returned.  If.**
2c520 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
2c530 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70 61  C_LT then the pa
2c540 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ge returned will
2c550 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   be less than or
2c560 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61   equal.** to nea
2c570 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68 20  rby if any such 
2c580 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49 66  page exists.  If
2c590 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f   eMode is BTALLO
2c5a0 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72 65  C_ANY then there
2c5b0 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74 72  .** are no restr
2c5c0 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68  ictions on which
2c5d0 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e 65   page is returne
2c5e0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2c5f0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2c600 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
2c610 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt,         /* 
2c620 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d  The btree */.  M
2c630 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
2c640 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 70        /* Store p
2c650 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
2c660 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65 72  located page her
2c670 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  e */.  Pgno *pPg
2c680 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
2c690 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65 20   Store the page 
2c6a0 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20  number here */. 
2c6b0 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20   Pgno nearby,   
2c6c0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63          /* Searc
2c6d0 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65 61  h for a page nea
2c6e0 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  r this one */.  
2c6f0 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20 20  u8 eMode        
2c700 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f         /* BTALLO
2c710 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43  C_EXACT, BTALLOC
2c720 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f  _LT, or BTALLOC_
2c730 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  ANY */.){.  MemP
2c740 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
2c750 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
2c760 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c770 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
2c780 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
2c790 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
2c7a0 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
2c7b0 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
2c7c0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
2c7d0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
2c7e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
2c7f0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
2c800 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
2c810 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
2c820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2c830 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
2c840 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2c850 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2c860 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f  );.  assert( eMo
2c870 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20  de==BTALLOC_ANY 
2c880 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26 20  || (nearby>0 && 
2c890 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d  IfNotOmitAV(pBt-
2c8a0 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29 3b  >autoVacuum)) );
2c8b0 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d  .  pPage1 = pBt-
2c8c0 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61 67  >pPage1;.  mxPag
2c8d0 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  e = btreePagecou
2c8e0 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56  nt(pBt);.  /* EV
2c8f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31  IDENCE-OF: R-051
2c900 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d 62  19-02637 The 4-b
2c910 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
2c920 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
2c930 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20   36.  ** stores 
2c940 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61 6c  stores the total
2c950 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2c960 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2c970 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62  . */.  n = get4b
2c980 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2c990 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74 63  ta[36]);.  testc
2c9a0 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31  ase( n==mxPage-1
2c9b0 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50   );.  if( n>=mxP
2c9c0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
2c9d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2c9e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
2c9f0 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
2ca00 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
2ca10 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
2ca20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
2ca30 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
2ca40 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
2ca50 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
2ca60 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
2ca70 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
2ca80 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
2ca90 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
2caa0 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d      /* If eMode=
2cab0 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61  =BTALLOC_EXACT a
2cac0 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74 68  nd a query of th
2cad0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
2cae0 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20    ** shows that 
2caf0 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79  the page 'nearby
2cb00 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f  ' is somewhere o
2cb10 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2cb20 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
2cb30 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c   entire-list wil
2cb40 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  l be searched fo
2cb50 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20  r that page..   
2cb60 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2cb70 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2cb80 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65  UM.    if( eMode
2cb90 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2cba0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61  ){.      if( nea
2cbb0 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
2cbc0 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b         u8 eType;
2cbd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2cbe0 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20   nearby>0 );.   
2cbf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
2cc00 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
2cc10 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2cc20 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72  mapGet(pBt, near
2cc30 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a  by, &eType, 0);.
2cc40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2cc50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cc60 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
2cc70 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2cc80 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72  {.          sear
2cc90 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
2cca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ccb0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64    }else if( eMod
2ccc0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b  e==BTALLOC_LE ){
2ccd0 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73  .      searchLis
2cce0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  t = 1;.    }.#en
2ccf0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72  dif..    /* Decr
2cd00 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c  ement the free-l
2cd10 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20  ist count by 1. 
2cd20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68  Set iTrunk to th
2cd30 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20  e index of the. 
2cd40 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65     ** first free
2cd50 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
2cd60 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20  . iPrevTrunk is 
2cd70 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20  initially 1..   
2cd80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
2cd90 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2cda0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
2cdb0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2cdc0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74  turn rc;.    put
2cdd0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2cde0 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a  Data[36], n-1);.
2cdf0 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65  .    /* The code
2ce00 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f   within this loo
2ce10 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e  p is run only on
2ce20 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72 63  ce if the 'searc
2ce30 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a  hList' variable.
2ce40 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72      ** is not tr
2ce50 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ue. Otherwise, i
2ce60 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  t runs once for 
2ce70 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20  each trunk-page 
2ce80 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72  on the.    ** fr
2ce90 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68  ee-list until th
2cea0 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
2ceb0 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64  is located (eMod
2cec0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2ced0 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69  ).    ** or unti
2cee0 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74 68  l a page less th
2cef0 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  an 'nearby' is l
2cf00 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42  ocated (eMode==B
2cf10 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a  TALLOC_LT).    *
2cf20 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  /.    do {.     
2cf30 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54   pPrevTrunk = pT
2cf40 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  runk;.      if( 
2cf50 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2cf60 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2cf70 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31  E-OF: R-01506-11
2cf80 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69 6e  053 The first in
2cf90 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c  teger on a freel
2cfa0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  ist trunk page. 
2cfb0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65         ** is the
2cfc0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
2cfd0 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73  the next freelis
2cfe0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
2cff0 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20  the list or.    
2d000 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74      ** zero if t
2d010 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74 20  his is the last 
2d020 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2d030 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
2d040 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  iTrunk = get4byt
2d050 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
2d060 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20  Data[0]);.      
2d070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2d080 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
2d090 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68 65  -59841-13798 The
2d0a0 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
2d0b0 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
2d0c0 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20 20  fset 32.        
2d0d0 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70 61  ** stores the pa
2d0e0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2d0f0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
2d100 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20  he freelist, or 
2d110 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20  zero if.        
2d120 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ** the freelist 
2d130 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  is empty. */.   
2d140 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
2d150 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2d160 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
2d170 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61    }.      testca
2d180 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61  se( iTrunk==mxPa
2d190 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ge );.      if( 
2d1a0 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
2d1b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2d1c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2d1d0 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2d1e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2d1f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
2d200 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
2d210 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2d220 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d230 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2d240 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2d250 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2d260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
2d270 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
2d280 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2d290 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
2d2a0 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
2d2b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
2d2c0 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
2d2d0 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
2d2e0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2d2f0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
2d300 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
2d310 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
2d320 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
2d330 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
2d340 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
2d350 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
2d360 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
2d370 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
2d380 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
2d390 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
2d3a0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
2d3b0 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
2d3c0 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
2d3d0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
2d3e0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
2d3f0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
2d400 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
2d410 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
2d420 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2d430 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
2d440 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2d450 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2d460 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2d470 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2d480 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2d490 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2d4a0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2d4b0 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
2d4c0 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
2d4d0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2d4e0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2d4f0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2d500 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
2d510 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2d520 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
2d530 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
2d540 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
2d550 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
2d560 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
2d570 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
2d580 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
2d590 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
2d5a0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
2d5b0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2d5c0 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
2d5d0 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
2d5e0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
2d5f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2d600 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2d610 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
2d620 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2d630 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2d640 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2d650 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d660 73 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20  searchList .    
2d670 20 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72          && (near
2d680 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69  by==iTrunk || (i
2d690 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20  Trunk<nearby && 
2d6a0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2d6b0 45 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  E)) .      ){.  
2d6c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73        /* The lis
2d6d0 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63  t is being searc
2d6e0 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75  hed and this tru
2d6f0 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70  nk page is the p
2d700 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  age.        ** t
2d710 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61  o allocate, rega
2d720 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
2d730 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e  r it has leaves.
2d740 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2d750 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72      *pPgno = iTr
2d760 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  unk;.        *pp
2d770 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
2d780 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
2d790 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
2d7a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2d7b0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
2d7c0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2d7d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2d7e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2d7f0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2d800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2d810 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
2d820 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
2d830 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
2d840 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
2d850 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
2d860 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2d870 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2d880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2d8a0 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72  gerWrite(pPrevTr
2d8b0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
2d8c0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
2d8d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2d8f0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2d900 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2d910 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2d920 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75  memcpy(&pPrevTru
2d930 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
2d940 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2d950 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
2d960 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2d970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2d980 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72   trunk page is r
2d990 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63  equired by the c
2d9a0 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e  aller but it con
2d9b0 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20  tains .         
2d9c0 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   ** pointers to 
2d9d0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73  free-list leaves
2d9e0 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66  . The first leaf
2d9f0 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b   becomes a trunk
2da00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61  .          ** pa
2da10 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
2da20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
2da30 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
2da40 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20  *pNewTrunk;.    
2da50 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54        Pgno iNewT
2da60 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2da70 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38  &pTrunk->aData[8
2da80 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ]);.          if
2da90 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61  ( iNewTrunk>mxPa
2daa0 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20  ge ){ .         
2dab0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2dac0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2dad0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2dae0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2daf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2db00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2db10 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
2db20 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
2db30 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
2db40 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
2db50 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
2db60 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2db70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2db80 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2db90 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2dba0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
2dbb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2dbc0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2dbd0 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
2dbe0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2dbf0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2dc00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2dc10 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
2dc20 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
2dc30 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2dc40 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2dc50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2dc60 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2dc70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
2dc80 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2dc90 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
2dca0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
2dcb0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
2dcc0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
2dcd0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
2dce0 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
2dcf0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
2dd00 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
2dd10 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2dd20 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
2dd30 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
2dd40 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
2dd50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
2dd60 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2dd70 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
2dd80 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
2dd90 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2dda0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
2ddb0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
2ddc0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2ddd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2dde0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2ddf0 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
2de00 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2de10 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
2de30 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2de40 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2de50 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2de60 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
2de70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
2de80 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
2de90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dea0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
2deb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
2dec0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
2ded0 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
2dee0 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
2def0 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
2df00 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
2df10 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
2df20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
2df30 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
2df40 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
2df50 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
2df60 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
2df70 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
2df80 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
2df90 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
2dfa0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65  ;.        if( ne
2dfb0 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20  arby>0 ){.      
2dfc0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20      u32 i;.     
2dfd0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
2dfe0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2dff0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
2e000 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
2e010 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
2e020 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2e030 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
2e040 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
2e050 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2e060 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61    if( iPage<=nea
2e070 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rby ){.         
2e080 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
2e090 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
2e0a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2e0b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e0c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e0d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e0e0 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
2e0f0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
2e100 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
2e110 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
2e120 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29  ta[8]) - nearby)
2e130 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
2e140 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
2e150 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e160 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33  int d2 = sqlite3
2e170 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
2e180 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
2e190 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
2e1a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
2e1b0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
2e1c0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
2e1d0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
2e1e0 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b        dist = d2;
2e1f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2e200 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2e210 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e220 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e230 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b      closest = 0;
2e240 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
2e250 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
2e260 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c  byte(&aData[8+cl
2e270 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20  osest*4]);.     
2e280 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61     testcase( iPa
2e290 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  ge==mxPage );.  
2e2a0 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e        if( iPage>
2e2b0 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
2e2c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e2d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2e2e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2e2f0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2e300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e310 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
2e320 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
2e330 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
2e340 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
2e350 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
2e360 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
2e370 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2e380 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2e390 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
2e3a0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
2e3b0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2e3c0 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
2e3d0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
2e3e0 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
2e3f0 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
2e400 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
2e410 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
2e420 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
2e430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e440 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
2e450 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
2e460 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
2e470 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2e480 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2e490 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2e4a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2e4b0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
2e4c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2e4d0 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
2e4e0 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
2e4f0 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
2e500 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
2e510 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
2e520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2e530 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
2e540 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
2e550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
2e560 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
2e570 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
2e580 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
2e590 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
2e5a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2e5b0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
2e5c0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
2e5d0 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b  age, noContent);
2e5e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2e5f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e600 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2e610 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2e620 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
2e630 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
2e640 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e650 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e660 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2e670 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2e680 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e6a0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
2e6b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e6c0 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
2e6d0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
2e6e0 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  ;.      pPrevTru
2e6f0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69  nk = 0;.    }whi
2e700 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29  le( searchList )
2e710 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
2e720 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70  * There are no p
2e730 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
2e740 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20  list, so append 
2e750 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68  a new page to th
2e760 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
2e770 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  e image..    **.
2e780 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c      ** Normally,
2e790 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63   new pages alloc
2e7a0 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  ated by this blo
2e7b0 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73  ck can be reques
2e7c0 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  ted from the.   
2e7d0 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20   ** pager layer 
2e7e0 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
2e7f0 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
2e800 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68  This prevents th
2e810 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
2e820 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65  rom trying to re
2e830 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e  ad the pages con
2e840 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20  tent from disk. 
2e850 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a  However, if the.
2e860 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74      ** current t
2e870 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
2e880 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f  lready run one o
2e890 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74  r more increment
2e8a0 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a  al-vacuum.    **
2e8b0 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65   steps, then the
2e8c0 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f   page we are abo
2e8d0 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d  ut to allocate m
2e8e0 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65  ay contain conte
2e8f0 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69  nt.    ** that i
2e900 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68  s required in th
2e910 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
2e920 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63  lback. In this c
2e930 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e  ase, do.    ** n
2e940 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f  ot set the no-co
2e950 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73  ntent flag. This
2e960 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65   causes the page
2e970 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f  r to load and jo
2e980 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65  urnal.    ** the
2e990 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f   current page co
2e9a0 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65  ntent before ove
2e9b0 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20  rwriting it..   
2e9c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20   **.    ** Note 
2e9d0 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77  that the pager w
2e9e0 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  ill not actually
2e9f0 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
2ea00 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20   or journal .   
2ea10 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   ** content for 
2ea20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65  any page that re
2ea30 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61  ally does lie pa
2ea40 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2ea50 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
2ea60 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  * file on disk. 
2ea70 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f  So the effects o
2ea80 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20  f disabling the 
2ea90 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d  no-content optim
2eaa0 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  ization.    ** h
2eab0 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64  ere are confined
2eac0 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
2ead0 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e  that lie between
2eae0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
2eaf0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
2eb00 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e  image and the en
2eb10 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  d of the databas
2eb20 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
2eb30 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e     int bNoConten
2eb40 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69  t = (0==IfNotOmi
2eb50 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e  tAV(pBt->bDoTrun
2eb60 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45  cate))? PAGER_GE
2eb70 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a  T_NOCONTENT:0;..
2eb80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2eb90 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
2eba0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2ebb0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2ebc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42  eturn rc;.    pB
2ebd0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  t->nPage++;.    
2ebe0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
2ebf0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
2ec00 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50  E(pBt) ) pBt->nP
2ec10 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20  age++;..#ifndef 
2ec20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2ec30 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2ec40 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
2ec50 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  & PTRMAP_ISPAGE(
2ec60 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  pBt, pBt->nPage)
2ec70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2ec80 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
2ec90 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2eca0 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
2ecb0 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
2ecc0 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
2ecd0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
2ece0 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
2ecf0 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
2ed00 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
2ed10 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
2ed20 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
2ed30 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
2ed40 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
2ed50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
2ed60 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
2ed70 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
2ed80 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
2ed90 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
2eda0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
2edb0 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29  n", pBt->nPage))
2edc0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2edd0 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44  pBt->nPage!=PEND
2ede0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2edf0 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  t) );.      rc =
2ee00 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2ee10 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26  t, pBt->nPage, &
2ee20 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  pPg, bNoContent)
2ee30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2ee40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ee50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2ee60 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
2ee70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2ee80 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2ee90 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
2eea0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2eeb0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74  rn rc;.      pBt
2eec0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
2eed0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
2eee0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
2eef0 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e  GE(pBt) ){ pBt->
2ef00 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d  nPage++; }.    }
2ef10 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34  .#endif.    put4
2ef20 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70  byte(28 + (u8*)p
2ef30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
2ef40 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  a, pBt->nPage);.
2ef50 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
2ef60 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73  ->nPage;..    as
2ef70 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
2ef80 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
2ef90 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
2efa0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2efb0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
2efc0 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
2efd0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2efe0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2eff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f000 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
2f010 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2f020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f030 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
2f040 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
2f050 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
2f060 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
2f070 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
2f080 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
2f090 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
2f0a0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
2f0b0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
2f0c0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
2f0d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
2f0e0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
2f0f0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
2f100 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2f110 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
2f120 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
2f130 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
2f140 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
2f150 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2f160 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
2f170 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
2f180 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2f190 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2f1a0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a  PT;.    }.    (*
2f1b0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20  ppPage)->isInit 
2f1c0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2f1d0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
2f1e0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21   }.  assert( rc!
2f1f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71  =SQLITE_OK || sq
2f200 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
2f210 65 61 62 6c 65 28 28 2a 70 70 50 61 67 65 29 2d  eable((*ppPage)-
2f220 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
2f230 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f240 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f250 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20   is used to add 
2f260 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68  page iPage to th
2f270 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2f280 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49  free-list. .** I
2f290 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
2f2a0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  t the page is no
2f2b0 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74  t already a part
2f2c0 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73   of the free-lis
2f2d0 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  t..**.** The val
2f2e0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
2f2f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2f300 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2f310 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a  n is optional..*
2f320 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
2f330 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20  happens to have 
2f340 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2f350 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20   MemPage object 
2f360 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
2f370 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20  g to page iPage 
2f380 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61  handy, it may pa
2f390 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63  ss it as the sec
2f3a0 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f  ond value. .** O
2f3b0 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79  therwise, it may
2f3c0 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a   pass NULL..**.*
2f3d0 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74  * If a pointer t
2f3e0 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  o a MemPage obje
2f3f0 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ct is passed as 
2f400 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2f410 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65  ent,.** its refe
2f420 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e  rence count is n
2f430 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68  ot altered by th
2f440 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
2f450 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
2f460 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70  age2(BtShared *p
2f470 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65  Bt, MemPage *pMe
2f480 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67  mPage, Pgno iPag
2f490 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
2f4a0 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
2f4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65            /* Fre
2f4c0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2f4d0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75  e */.  Pgno iTru
2f4e0 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nk = 0;         
2f4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2f500 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  ge number of fre
2f510 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2f520 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20  e */ .  MemPage 
2f530 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
2f540 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c  Page1;      /* L
2f550 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74  ocal reference t
2f560 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65  o page 1 */.  Me
2f570 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20  mPage *pPage;   
2f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f590 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20    /* Page being 
2f5a0 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55  freed. May be NU
2f5b0 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  LL. */.  int rc;
2f5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f5e0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2f5f0 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
2f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f610 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
2f620 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2f630 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  on free-list */.
2f640 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2f650 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2f660 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2f670 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29  ssert( iPage>1 )
2f680 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
2f690 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
2f6a0 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
2f6b0 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  ;..  if( pMemPag
2f6c0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
2f6d0 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
2f6e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
2f6f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
2f700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
2f710 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
2f720 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
2f730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
2f740 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
2f750 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
2f760 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
2f770 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f780 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2f790 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2f7a0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
2f7b0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
2f7c0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2f7d0 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
2f7e0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2f7f0 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
2f800 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
2f810 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
2f820 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
2f830 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
2f840 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
2f850 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
2f860 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
2f870 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
2f880 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
2f890 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
2f8a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
2f8b0 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
2f8c0 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
2f8d0 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
2f8e0 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
2f8f0 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
2f900 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f910 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2f920 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
2f930 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
2f940 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
2f950 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
2f960 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
2f970 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
2f980 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
2f990 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
2f9a0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
2f9b0 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
2f9c0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
2f9d0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
2f9e0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
2f9f0 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
2fa00 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
2fa10 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
2fa20 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
2fa30 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
2fa40 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
2fa50 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2fa60 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
2fa70 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
2fa80 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
2fa90 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
2faa0 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
2fab0 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
2fac0 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
2fad0 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
2fae0 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
2faf0 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
2fb00 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
2fb10 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
2fb20 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
2fb30 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
2fb40 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
2fb50 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
2fb60 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
2fb70 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
2fb80 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
2fb90 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
2fba0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2fbb0 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
2fbc0 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
2fbd0 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
2fbe0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
2fbf0 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
2fc00 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
2fc10 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
2fc20 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
2fc30 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
2fc40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2fc50 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
2fc60 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
2fc70 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
2fc80 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2fc90 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2fca0 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
2fcb0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
2fcc0 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
2fcd0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
2fce0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fcf0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
2fd00 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2fd10 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
2fd20 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
2fd30 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
2fd40 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
2fd50 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
2fd60 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
2fd70 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
2fd80 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
2fd90 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2fda0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2fdb0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
2fdc0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
2fdd0 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
2fde0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2fdf0 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
2fe00 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2fe10 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
2fe20 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
2fe30 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
2fe40 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
2fe50 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
2fe60 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
2fe70 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2fe80 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
2fe90 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
2fea0 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
2feb0 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
2fec0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
2fed0 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
2fee0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
2fef0 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
2ff00 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
2ff10 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
2ff20 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
2ff30 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
2ff40 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
2ff50 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
2ff60 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
2ff70 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
2ff80 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
2ff90 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
2ffa0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
2ffb0 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
2ffc0 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
2ffd0 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
2ffe0 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
2fff0 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
30000 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
30010 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
30020 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
30030 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
30040 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
30050 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
30060 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
30070 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
30080 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
30090 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
300a0 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
300b0 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
300c0 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
300d0 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
300e0 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
300f0 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
30100 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
30110 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
30120 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
30130 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
30140 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
30150 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
30160 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
30170 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
30180 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
30190 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
301a0 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
301b0 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
301c0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
301d0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
301e0 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
301f0 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
30200 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
30210 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
30220 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
30230 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
30240 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
30250 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
30260 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
30270 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
30280 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
30290 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
302a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
302b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
302c0 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
302d0 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
302e0 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
302f0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
30300 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
30310 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
30320 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
30330 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
30340 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
30350 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
30360 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
30370 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
30380 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30390 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
303a0 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
303b0 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
303c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
303d0 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
303e0 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
303f0 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
30400 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
30410 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
30420 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
30430 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
30440 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
30450 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
30460 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
30470 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
30480 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
30490 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
304a0 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
304b0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
304c0 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
304d0 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
304e0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
304f0 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
30500 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
30510 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
30520 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
30530 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
30540 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
30550 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
30560 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
30570 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
30580 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
30590 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
305a0 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
305b0 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
305c0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
305d0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
305e0 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
305f0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
30600 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
30610 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30620 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
30630 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
30640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30650 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
30660 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
30670 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
30680 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
30690 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
306a0 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
306b0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
306c0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
306d0 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
306e0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
306f0 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
30700 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
30710 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
30720 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
30730 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
30740 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
30750 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
30760 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
30770 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
30780 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
30790 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
307a0 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
307b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
307c0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
307d0 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
307e0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
307f0 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
30800 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
30810 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
30820 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
30830 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
30840 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
30850 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
30860 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f   Write the.** lo
30870 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74  cal Cell size (t
30880 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
30890 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e  es on the origin
308a0 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e  al page, omittin
308b0 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69  g.** overflow) i
308c0 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a  nto *pnSize..*/.
308d0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
308e0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
308f0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
30900 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
30910 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
30920 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
30930 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
30940 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
30950 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
30960 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20   u16 *pnSize    
30970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
30980 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  te the size of t
30990 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a  he Cell here */.
309a0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
309b0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
309c0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
309d0 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
309e0 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
309f0 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20  nt nOvfl;.  u32 
30a00 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
30a10 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30a20 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
30a30 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
30a40 3b 0a 20 20 62 74 72 65 65 50 61 72 73 65 43 65  ;.  btreeParseCe
30a50 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
30a60 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70  ll, &info);.  *p
30a70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69  nSize = info.nSi
30a80 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  ze;.  if( info.i
30a90 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
30aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30ab0 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
30ac0 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
30ad0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
30ae0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
30af0 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66  .  if( pCell+inf
30b00 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 20 3e 20  o.iOverflow+3 > 
30b10 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
30b20 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
30b30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30b40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
30b50 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
30b60 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
30b70 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
30b80 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
30b90 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
30ba0 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74  flow]);.  assert
30bb0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
30bc0 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
30bd0 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
30be0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
30bf0 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
30c00 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
30c10 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
30c20 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
30c30 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
30c40 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
30c50 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
30c60 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
30c70 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d      Pgno iNext =
30c80 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   0;.    MemPage 
30c90 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20  *pOvfl = 0;.    
30ca0 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c  if( ovflPgno<2 |
30cb0 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65  | ovflPgno>btree
30cc0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
30cd0 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20  {.      /* 0 is 
30ce0 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65  not a legal page
30cf0 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65   number and page
30d00 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20   1 cannot be an 
30d10 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  .      ** overfl
30d20 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f  ow page. Therefo
30d30 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32  re if ovflPgno<2
30d40 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64   or past the end
30d50 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a   of the .      *
30d60 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62  * file the datab
30d70 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
30d80 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  upt. */.      re
30d90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
30da0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
30db0 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b      if( nOvfl ){
30dc0 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f  .      rc = getO
30dd0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
30de0 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66   ovflPgno, &pOvf
30df0 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20  l, &iNext);.    
30e00 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30e10 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
30e20 20 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20   if( ( pOvfl || 
30e30 28 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50  ((pOvfl = btreeP
30e40 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f  ageLookup(pBt, o
30e50 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a  vflPgno))!=0) ).
30e60 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
30e70 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
30e80 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29  (pOvfl->pDbPage)
30e90 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=1.    ){.     
30ea0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20   /* There is no 
30eb0 72 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f  reason any curso
30ec0 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e  r should have an
30ed0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
30ee0 65 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a  erence .      **
30ef0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
30f00 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  page belonging t
30f10 6f 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73  o a cell that is
30f20 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75   being deleted/u
30f30 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a  pdated..      **
30f40 20 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69   So if there exi
30f50 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  sts more than on
30f60 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
30f70 68 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69  his page, then i
30f80 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74  t .      ** must
30f90 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61   not really be a
30fa0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
30fb0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
30fc0 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
30fd0 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  . .      ** It i
30fe0 73 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74  s helpful to det
30ff0 65 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20  ect this before 
31000 63 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65  calling freePage
31010 32 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a  2(), as .      *
31020 2a 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61  * freePage2() ma
31030 79 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20  y zero the page 
31040 63 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75  contents if secu
31050 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69  re-delete mode i
31060 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c  s.      ** enabl
31070 65 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65  ed. If this 'ove
31080 72 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70  rflow' page happ
31090 65 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65  ens to be a page
310a0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
310b0 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65  ** caller is ite
310c0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f  rating through o
310d0 72 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20  r using in some 
310e0 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a  other way, this.
310f0 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
31100 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20  problematic..   
31110 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
31120 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31130 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BKPT;.    }else{
31140 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65  .      rc = free
31150 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c  Page2(pBt, pOvfl
31160 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20  , ovflPgno);.   
31170 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66   }..    if( pOvf
31180 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
31190 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
311a0 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
311b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
311c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
311d0 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74  ovflPgno = iNext
311e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
311f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
31200 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79  ** Create the by
31210 74 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64  te sequence used
31220 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
31230 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61  cell on page pPa
31240 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  ge.** and write 
31250 74 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e  that byte sequen
31260 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e  ce into pCell[].
31270 20 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    Overflow pages
31280 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
31290 64 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20  d and filled in 
312a0 61 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  as necessary.  T
312b0 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65  he calling proce
312c0 64 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f  dure.** is respo
312d0 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e  nsible for makin
312e0 67 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e  g sure sufficien
312f0 74 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e  t space has been
31300 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f   allocated.** fo
31310 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a  r pCell[]..**.**
31320 20 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c   Note that pCell
31330 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73   does not necess
31340 61 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e  ary need to poin
31350 74 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e  t to the pPage->
31360 61 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20  aData.** area.  
31370 70 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e  pCell might poin
31380 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72  t to some tempor
31390 61 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68  ary storage.  Th
313a0 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62  e cell will.** b
313b0 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e  e constructed in
313c0 20 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20   this temporary 
313d0 61 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64  area then copied
313e0 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
313f0 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a  ta.** later..*/.
31400 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49  static int fillI
31410 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  nCell(.  MemPage
31420 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
31430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
31440 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
31450 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  s the cell */.  
31460 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
31470 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Cell,          /
31480 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  * Complete text 
31490 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  of the cell */. 
314a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
314b0 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20  y, i64 nKey,    
314c0 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
314d0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74  const void *pDat
314e0 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f  a,int nData,   /
314f0 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
31500 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
31510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31520 2a 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74  * Extra zero byt
31530 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
31540 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a  pData */.  int *
31550 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
31560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
31570 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
31580 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
31590 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
315a0 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
315b0 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69  nSrc, n, rc;.  i
315c0 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20  nt spaceLeft;.  
315d0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
315e0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
315f0 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
31600 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
31610 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e  pPrior;.  unsign
31620 65 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61  ed char *pPayloa
31630 64 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  d;.  BtShared *p
31640 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
31650 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c  .  Pgno pgnoOvfl
31660 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61   = 0;.  int nHea
31670 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  der;..  assert( 
31680 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
31690 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
316a0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70  utex) );..  /* p
316b0 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65  Page is not nece
316c0 73 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c  ssarily writeabl
316d0 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69  e since pCell mi
316e0 67 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79  ght be auxiliary
316f0 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61  .  ** buffer spa
31700 63 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72  ce that is separ
31710 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61  ate from the pPa
31720 67 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a  ge buffer area *
31730 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  /.  assert( pCel
31740 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  l<pPage->aData |
31750 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d  | pCell>=&pPage-
31760 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65  >aData[pBt->page
31770 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
31780 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
31790 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
317a0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
317b0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
317c0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
317d0 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e  Header = pPage->
317e0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
317f0 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61  nPayload = nData
31800 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20   + nZero;.  if( 
31810 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
31820 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  f ){.    nHeader
31830 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
31840 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
31850 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65   nPayload);.  }e
31860 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
31870 20 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20   nData==0 );.   
31880 20 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d   assert( nZero==
31890 30 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  0 );.  }.  nHead
318a0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
318b0 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
318c0 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
318d0 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
318e0 74 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65  the payload size
318f0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d   */.  if( pPage-
31900 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
31910 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
31920 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
31930 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
31940 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20  }else{ .    if( 
31950 4e 45 56 45 52 28 6e 4b 65 79 3e 30 78 37 66 66  NEVER(nKey>0x7ff
31960 66 66 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30  fffff || pKey==0
31970 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
31980 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
31990 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
319a0 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74   nPayload = (int
319b0 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
319c0 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
319d0 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
319e0 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  }.  if( nPayload
319f0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
31a00 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65  l ){.    n = nHe
31a10 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b  ader + nPayload;
31a20 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
31a30 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==3 );.    testc
31a40 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20  ase( n==4 );.   
31a50 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34   if( n<4 ) n = 4
31a60 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
31a70 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
31a80 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
31a90 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b   pPrior = pCell;
31aa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
31ab0 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69  t mn = pPage->mi
31ac0 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20  nLocal;.    n = 
31ad0 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  mn + (nPayload -
31ae0 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70   mn) % (pPage->p
31af0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
31b00 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
31b10 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
31b20 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
31b30 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
31b40 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
31b50 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65     if( n > pPage
31b60 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d  ->maxLocal ) n =
31b70 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65   mn;.    spaceLe
31b80 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53  ft = n;.    *pnS
31b90 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65  ize = n + nHeade
31ba0 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f  r + 4;.    pPrio
31bb0 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  r = &pCell[nHead
31bc0 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  er+n];.  }.  pPa
31bd0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
31be0 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41  Header];..  /* A
31bf0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72  t this point var
31c00 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65  iables should be
31c10 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   set as follows:
31c20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61  .  **.  **   nPa
31c30 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
31c40 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  Total payload si
31c50 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a  ze in bytes.  **
31c60 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20     pPayload     
31c70 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74        Begin writ
31c80 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65  ing payload here
31c90 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66  .  **   spaceLef
31ca0 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65  t          Space
31cb0 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50   available at pP
31cc0 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79  ayload.  If nPay
31cd0 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a  load>spaceLeft,.
31ce0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
31cf0 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d            that m
31d00 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73  eans content mus
31d10 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65  t spill into ove
31d20 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a  rflow pages..  *
31d30 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  *   *pnSize     
31d40 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74         Size of t
31d50 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e  he local cell (n
31d60 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72  ot counting over
31d70 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a  flow pages).  **
31d80 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20     pPrior       
31d90 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77        Where to w
31da0 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66  rite the pgno of
31db0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
31dc0 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20  low page.  **.  
31dd0 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f  ** Use a call to
31de0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
31df0 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74  tr() to verify t
31e00 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61  hat the values a
31e10 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63  bove.  ** were c
31e20 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c  omputed correctl
31e30 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49  y..  */.#if SQLI
31e40 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  TE_DEBUG.  {.   
31e50 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
31e60 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
31e70 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
31e80 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
31e90 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d  assert( nHeader=
31ea0 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c  (int)(info.pPayl
31eb0 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a  oad - pCell) );.
31ec0 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f      assert( info
31ed0 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
31ee0 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69     assert( *pnSi
31ef0 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ze == info.nSize
31f00 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
31f10 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66  spaceLeft == inf
31f20 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  o.nLocal );.    
31f30 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 20 3d  assert( pPrior =
31f40 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
31f50 76 65 72 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a  verflow] );.  }.
31f60 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69  #endif..  /* Wri
31f70 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  te the payload i
31f80 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65  nto the local Ce
31f90 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61  ll and any extra
31fa0 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
31fb0 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ages */.  while(
31fc0 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
31fd0 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
31fe0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
31ff0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32000 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
32010 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
32020 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
32030 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
32040 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
32050 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
32060 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
32070 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
32080 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
32090 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
320a0 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
320b0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
320c0 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
320d0 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
320e0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
320f0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
32100 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
32110 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
32120 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
32130 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
32140 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
32150 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32160 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
32170 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
32180 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
32190 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
321a0 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
321b0 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
321c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
321d0 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
321e0 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
321f0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
32200 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
32210 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
32220 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
32230 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
32240 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
32250 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
32260 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
32270 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
32280 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
32290 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
322a0 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
322b0 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
322c0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
322d0 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
322e0 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
322f0 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
32300 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
32310 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
32320 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
32330 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
32340 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
32350 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
32360 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
32370 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
32380 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
32390 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
323a0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
323b0 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
323c0 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
323d0 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
323e0 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
323f0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
32400 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
32410 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
32420 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
32430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
32440 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
32450 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
32460 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
32470 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
32480 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
32490 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
324a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
324b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
324c0 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
324d0 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
324e0 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
324f0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
32500 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
32510 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
32520 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
32530 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
32540 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
32550 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
32560 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
32570 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
32580 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
32590 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
325a0 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
325b0 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
325c0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
325d0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
325e0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
325f0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
32600 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
32610 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
32620 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
32630 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
32640 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
32650 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
32660 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
32670 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
32680 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
32690 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
326a0 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
326b0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
326c0 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
326d0 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
326e0 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
326f0 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
32700 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
32710 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
32720 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
32730 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
32740 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
32750 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
32760 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
32770 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
32780 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
32790 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
327a0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
327b0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
327c0 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
327d0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
327e0 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
327f0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
32800 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
32810 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
32820 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
32830 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
32840 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
32850 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
32860 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
32870 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
32880 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
32890 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
328a0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
328b0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
328c0 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
328d0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
328e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
328f0 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
32900 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
32910 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
32920 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
32930 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
32940 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32950 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
32960 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
32970 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
32980 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
32990 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
329a0 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
329b0 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
329c0 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
329d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
329e0 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
329f0 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
32a00 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
32a10 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
32a20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
32a30 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
32a40 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
32a50 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
32a60 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
32a70 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
32a80 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
32a90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
32aa0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
32ab0 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
32ac0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
32ad0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
32ae0 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
32af0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
32b00 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
32b10 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
32b20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
32b30 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
32b40 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
32b50 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
32b60 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
32b70 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
32b80 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
32b90 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
32ba0 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
32bb0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
32bc0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
32bd0 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
32be0 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
32bf0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
32c00 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
32c10 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
32c20 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
32c30 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
32c40 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20  nt *pRC){.  u32 
32c50 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
32c60 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
32c70 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
32c80 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
32c90 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
32ca0 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
32cb0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
32cc0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
32cd0 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
32ce0 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
32cf0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
32d00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
32d10 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
32d20 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
32d30 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
32d40 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
32d50 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
32d60 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
32d70 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
32d80 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
32d90 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
32da0 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
32db0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
32dc0 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
32dd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
32de0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
32df0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
32e00 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
32e10 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32e20 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
32e30 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
32e40 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
32e50 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
32e60 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70  lIdx[2*idx];.  p
32e70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
32e80 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
32e90 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
32ea0 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
32eb0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
32ec0 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
32ed0 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
32ee0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
32ef0 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28   );.  if( pc < (
32f00 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61  u32)get2byte(&da
32f10 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63  ta[hdr+5]) || pc
32f20 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
32f30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
32f40 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
32f50 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
32f60 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
32f70 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
32f80 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
32f90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
32fa0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
32fb0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50  return;.  }.  pP
32fc0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
32fd0 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
32fe0 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ==0 ){.    memse
32ff0 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
33000 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b  0, 4);.    data[
33010 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20  hdr+7] = 0;.    
33020 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
33030 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42  dr+5], pPage->pB
33040 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
33050 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
33060 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
33070 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67  sableSize - pPag
33080 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20  e->hdrOffset.   
33090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330a0 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69      - pPage->chi
330b0 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20  ldPtrSize - 8;. 
330c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d   }else{.    memm
330d0 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20  ove(ptr, ptr+2, 
330e0 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  2*(pPage->nCell 
330f0 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74  - idx));.    put
33100 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
33110 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
33120 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
33130 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a  ree += 2;.  }.}.
33140 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
33150 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
33160 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
33170 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
33180 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
33190 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
331a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
331b0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
331c0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
331d0 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
331e0 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
331f0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
33200 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
33210 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
33220 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
33230 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
33240 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
33250 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
33260 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
33270 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70  .** in pPage->ap
33280 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
33290 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
332a0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
332b0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
332c0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
332d0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
332e0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
332f0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
33300 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
33310 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
33320 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
33330 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
33340 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
33350 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
33360 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
33370 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
33380 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
33390 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
333a0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
333b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
333c0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
333d0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
333e0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
333f0 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
33400 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
33410 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
33420 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
33430 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
33440 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
33450 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
33460 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
33470 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
33480 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
33490 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
334a0 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
334b0 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
334c0 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
334d0 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
334e0 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
334f0 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
33500 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
33510 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
33520 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
33530 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
33540 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
33550 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
33560 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
33570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
33580 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
33590 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20 20 20  nt end;         
335a0 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70   /* First byte p
335b0 61 73 74 20 74 68 65 20 6c 61 73 74 20 63 65 6c  ast the last cel
335c0 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74  l pointer in dat
335d0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  a[] */.  int ins
335e0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
335f0 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20 77 68  dex in data[] wh
33600 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  ere new cell poi
33610 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74 65 64  nter is inserted
33620 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
33630 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64 72 65  fset;   /* Addre
33640 73 73 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ss of first cell
33650 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61 74 61   pointer in data
33660 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  [] */.  u8 *data
33670 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
33680 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
33690 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 0a 20  whole page */.. 
336a0 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
336b0 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  rn;..  assert( i
336c0 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d  >=0 && i<=pPage-
336d0 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f  >nCell+pPage->nO
336e0 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73  verflow );.  ass
336f0 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ert( MX_CELL(pPa
33700 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20  ge->pBt)<=10921 
33710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
33720 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45  ge->nCell<=MX_CE
33730 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c  LL(pPage->pBt) |
33740 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
33750 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
33760 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
33770 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
33780 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
33790 28 20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ( ArraySize(pPag
337a0 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61  e->apOvfl)==Arra
337b0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f  ySize(pPage->aiO
337c0 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74  vfl) );.  assert
337d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
337e0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
337f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20  >mutex) );.  /* 
33800 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20  The cell should 
33810 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65  normally be size
33820 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f  d correctly.  Ho
33830 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69  wever, when movi
33840 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72  ng a.  ** malfor
33850 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20  med cell from a 
33860 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20  leaf page to an 
33870 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69  interior page, i
33880 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a  f the cell size.
33890 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62    ** wanted to b
338a0 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75  e less than 4 bu
338b0 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70  t got rounded up
338c0 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61   to 4 on the lea
338d0 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a  f, then size.  *
338e0 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20  * might be less 
338f0 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a  than 8 (leaf-siz
33900 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20  e + pointer) on 
33910 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
33920 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74  e.  Hence.  ** t
33930 68 65 20 74 65 72 6d 20 61 66 74 65 72 20 74 68  he term after th
33940 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c  e || in the foll
33950 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20  owing assert(). 
33960 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  */.  assert( sz=
33970 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
33980 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
33990 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
339a0 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
339b0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
339c0 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
339d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
339e0 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
339f0 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20  y(pTemp, pCell, 
33a00 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  sz);.      pCell
33a10 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
33a20 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
33a30 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
33a40 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
33a50 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
33a60 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
33a70 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
33a80 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
33a90 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a  age->apOvfl)/siz
33aa0 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
33ab0 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
33ac0 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
33ad0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
33ae0 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
33af0 75 31 36 29 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a  u16)i;.  }else{.
33b00 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
33b10 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
33b20 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
33b30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
33b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a  TE_OK ){.      *
33b50 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  pRC = rc;.      
33b60 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
33b70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33b80 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
33b90 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
33ba0 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  ) );.    data = 
33bb0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
33bc0 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
33bd0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
33be0 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65 6c 6c  ;.    end = cell
33bf0 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65  Offset + 2*pPage
33c00 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 73  ->nCell;.    ins
33c10 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
33c20 32 2a 69 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  2*i;.    rc = al
33c30 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
33c40 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
33c50 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
33c60 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
33c70 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
33c80 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
33c90 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
33ca0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
33cb0 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
33cc0 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
33cd0 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   success */.    
33ce0 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 65  assert( idx >= e
33cf0 6e 64 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65  nd+2 );.    asse
33d00 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28 69  rt( idx+sz <= (i
33d10 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  nt)pPage->pBt->u
33d20 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
33d30 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b   pPage->nCell++;
33d40 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
33d50 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
33d60 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
33d70 64 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c  data[idx], pCell
33d80 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69  , sz);.    if( i
33d90 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
33da0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
33db0 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
33dc0 20 7d 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26   }.    memmove(&
33dd0 64 61 74 61 5b 69 6e 73 2b 32 5d 2c 20 26 64 61  data[ins+2], &da
33de0 74 61 5b 69 6e 73 5d 2c 20 65 6e 64 2d 69 6e 73  ta[ins], end-ins
33df0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
33e00 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
33e10 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
33e20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
33e30 66 66 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d  ffset+3], pPage-
33e40 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  >nCell);.#ifndef
33e50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
33e60 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
33e70 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f  pPage->pBt->auto
33e80 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
33e90 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20  /* The cell may 
33ea0 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65  contain a pointe
33eb0 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r to an overflow
33ec0 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72   page. If so, wr
33ed0 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ite.      ** the
33ee0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
33ef0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74  verflow page int
33f00 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
33f10 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
33f20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
33f30 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
33f40 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e   pRC);.    }.#en
33f50 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  dif.  }.}../*.**
33f60 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
33f70 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72  contains pointer
33f80 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65  s to nCell b-tre
33f90 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68  e page cells. Th
33fa0 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61  e .** szCell[] a
33fb0 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68  rray contains th
33fc0 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  e size in bytes 
33fd0 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68  of each cell. Th
33fe0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  is function.** r
33ff0 65 70 6c 61 63 65 73 20 74 68 65 20 63 75 72 72  eplaces the curr
34000 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
34010 70 61 67 65 20 70 50 67 20 77 69 74 68 20 74 68  page pPg with th
34020 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
34030 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e  e cell.** array.
34040 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74  .**.** Some of t
34050 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  he cells in apCe
34060 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74  ll[] may current
34070 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
34080 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  pPg. This.** fun
34090 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75  ction works arou
340a0 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73  nd problems caus
340b0 65 64 20 62 79 20 74 68 69 73 20 62 79 20 6d 61  ed by this by ma
340c0 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61  king a copy of a
340d0 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c  ny .** such cell
340e0 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  s before overwri
340f0 74 69 6e 67 20 74 68 65 20 70 61 67 65 20 64 61  ting the page da
34100 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65  ta..**.** The Me
34110 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c  mPage.nFree fiel
34120 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64  d is invalidated
34130 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
34140 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
34150 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
34160 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
34170 20 73 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c   set it correctl
34180 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
34190 64 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20  d rebuildPage(. 
341a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
341b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341c0 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61   /* Edit this pa
341d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ge */.  int nCel
341e0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
341f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
34200 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
34210 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   on page */.  u8
34220 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
34230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34240 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
34250 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
34260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34270 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
34280 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29   cell sizes */.)
34290 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
342a0 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
342b0 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
342c0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
342d0 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20   on pPg */.  u8 
342e0 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
342f0 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  pPg->aData;     
34300 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
34310 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67   to data for pPg
34320 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
34330 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
34340 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
34350 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  e;.  u8 * const 
34360 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73  pEnd = &aData[us
34370 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74  ableSize];.  int
34380 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   i;.  u8 *pCellp
34390 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
343a0 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  dx;.  u8 *pTmp =
343b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
343c0 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d  pSpace(pPg->pBt-
343d0 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a  >pPager);.  u8 *
343e0 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65  pData;..  i = ge
343f0 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
34400 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
34410 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61  &pTmp[i], &aData
34420 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  [i], usableSize 
34430 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d  - i);..  pData =
34440 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30   pEnd;.  for(i=0
34450 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
34460 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
34470 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   apCell[i];.    
34480 69 66 28 20 70 43 65 6c 6c 3e 61 44 61 74 61 20  if( pCell>aData 
34490 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b  && pCell<pEnd ){
344a0 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26  .      pCell = &
344b0 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61  pTmp[pCell - aDa
344c0 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ta];.    }.    p
344d0 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69  Data -= szCell[i
344e0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  ];.    memcpy(pD
344f0 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65  ata, pCell, szCe
34500 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 70 75 74 32  ll[i]);.    put2
34510 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28  byte(pCellptr, (
34520 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b  pData - aData));
34530 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d  .    pCellptr +=
34540 20 32 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   2;.    assert( 
34550 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 63 65 6c 6c 53  szCell[i]==cellS
34560 69 7a 65 50 74 72 28 70 50 67 2c 20 70 43 65 6c  izePtr(pPg, pCel
34570 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  l) );.  }..  /* 
34580 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66  The pPg->nFree f
34590 69 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20  ield is now set 
345a0 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65  incorrectly. The
345b0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78   caller will fix
345c0 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e   it. */.  pPg->n
345d0 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20  Cell = nCell;.  
345e0 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  pPg->nOverflow =
345f0 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28   0;..  put2byte(
34600 26 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  &aData[hdr+1], 0
34610 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  );.  put2byte(&a
34620 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67  Data[hdr+3], pPg
34630 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32  ->nCell);.  put2
34640 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
34650 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74  5], pData - aDat
34660 61 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b  a);.  aData[hdr+
34670 37 5d 20 3d 20 30 78 30 30 3b 0a 7d 0a 0a 2f 2a  7] = 0x00;.}../*
34680 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
34690 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c  [] contains nCel
346a0 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d  l pointers to b-
346b0 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61  tree cells. Arra
346c0 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74  y szCell.** cont
346d0 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e  ains the size in
346e0 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 73   bytes of each s
346f0 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66  uch cell. This f
34700 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
34710 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65 20   to .** add the 
34720 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e 20  cells stored in 
34730 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61 67  the array to pag
34740 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61 6e  e pPg. If it can
34750 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a 2a  not (because .**
34760 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
34770 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e 74  to be defragment
34780 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 65  ed before the ce
34790 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e  lls will fit), n
347a0 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65  on-zero.** is re
347b0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
347c0 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73 20  e, if the cells 
347d0 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65 73  are added succes
347e0 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a  sfully, zero is.
347f0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  ** returned..**.
34800 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65 6c  ** Argument pCel
34810 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  lptr points to t
34820 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
34830 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  n the cell-point
34840 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61 72  er array.** (par
34850 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20 74  t of page pPg) t
34860 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74 65  o populate. Afte
34870 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d  r cell apCell[0]
34880 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
34890 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c  he.** page body,
348a0 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65 74   a 16-bit offset
348b0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 70   is written to p
348c0 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20  Cellptr. And so 
348d0 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  on, for each.** 
348e0 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61  cell in the arra
348f0 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  y. It is the res
34900 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
34910 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73  he caller to ens
34920 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20 69  ure.** that it i
34930 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77 72  s safe to overwr
34940 69 74 65 20 74 68 69 73 20 70 61 72 74 20 6f 66  ite this part of
34950 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
34960 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57  r array..**.** W
34970 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
34980 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70  n is called, *pp
34990 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20 74  Data points to t
349a0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
349b0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  .** content area
349c0 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49 66   on page pPg. If
349d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
349e0 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73   content area is
349f0 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70   extended,.** *p
34a00 70 44 61 74 61 20 69 73 20 75 70 64 61 74 65 64  pData is updated
34a10 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
34a20 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74 68   new start of th
34a30 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a  e content area.*
34a40 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
34a50 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c  ng..**.** Finall
34a60 79 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65 67  y, argument pBeg
34a70 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  in points to the
34a80 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65 6c   byte immediatel
34a90 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a  y following the.
34aa0 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73 70  ** end of the sp
34ab0 61 63 65 20 72 65 71 75 69 72 65 64 20 62 79 20  ace required by 
34ac0 74 68 69 73 20 70 61 67 65 20 66 6f 72 20 74 68  this page for th
34ad0 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
34ae0 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20  rea (for.** all 
34af0 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74  cells - not just
34b00 20 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64 20   those inserted 
34b10 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  by the current c
34b20 61 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f 6e  all). If the con
34b30 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73  tent.** area mus
34b40 74 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  t be extended to
34b50 20 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f 69   before this poi
34b60 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  nt in order to a
34b70 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a  ccomodate all.**
34b80 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
34b90 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65 6c  [], then the cel
34ba0 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e  ls do not fit an
34bb0 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  d non-zero is re
34bc0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
34bd0 63 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72 74  c int pageInsert
34be0 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65  Array(.  MemPage
34bf0 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20 20   *pPg,          
34c00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
34c10 20 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74 6f   to add cells to
34c20 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69 6e   */.  u8 *pBegin
34c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34c40 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20        /* End of 
34c50 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72  cell-pointer arr
34c60 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44  ay */.  u8 **ppD
34c70 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
34c80 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
34c90 54 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20  T: Page content 
34ca0 2d 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f  -area pointer */
34cb0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c  .  u8 *pCellptr,
34cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34cd0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
34ce0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
34cf0 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ea */.  int nCel
34d00 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
34d10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34d20 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
34d30 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 75 38  d to pPg */.  u8
34d40 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
34d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34d60 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
34d70 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
34d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d90 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
34da0 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29   cell sizes */.)
34db0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20  {.  int i;.  u8 
34dc0 2a 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44  *aData = pPg->aD
34dd0 61 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61  ata;.  u8 *pData
34de0 20 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 63 6f   = *ppData;.  co
34df0 6e 73 74 20 69 6e 74 20 62 46 72 65 65 6c 69 73  nst int bFreelis
34e00 74 20 3d 20 61 44 61 74 61 5b 31 5d 20 7c 7c 20  t = aData[1] || 
34e10 61 44 61 74 61 5b 32 5d 3b 0a 20 20 61 73 73 65  aData[2];.  asse
34e20 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
34e30 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  | pPg->hdrOffset
34e40 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76  ==0 );    /* Nev
34e50 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67  er called on pag
34e60 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  e 1 */.  for(i=0
34e70 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
34e80 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73 7a  .    int sz = sz
34e90 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Cell[i];.    int
34ea0 20 72 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c   rc;.    u8 *pSl
34eb0 6f 74 3b 0a 20 20 20 20 69 66 28 20 62 46 72 65  ot;.    if( bFre
34ec0 65 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 70 53 6c  elist==0 || (pSl
34ed0 6f 74 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ot = pageFindSlo
34ee0 74 28 70 50 67 2c 20 73 7a 2c 20 26 72 63 2c 20  t(pPg, sz, &rc, 
34ef0 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
34f00 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20  pData -= sz;.   
34f10 20 20 20 69 66 28 20 70 44 61 74 61 3c 70 42 65     if( pData<pBe
34f20 67 69 6e 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  gin ) return 1;.
34f30 20 20 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44        pSlot = pD
34f40 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  ata;.    }.    m
34f50 65 6d 63 70 79 28 70 53 6c 6f 74 2c 20 61 70 43  emcpy(pSlot, apC
34f60 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  ell[i], sz);.   
34f70 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70   put2byte(pCellp
34f80 74 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61  tr, (pSlot - aDa
34f90 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70  ta));.    pCellp
34fa0 74 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a  tr += 2;.  }.  *
34fb0 70 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a  ppData = pData;.
34fc0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
34fd0 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
34fe0 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65  l[] contains nCe
34ff0 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62  ll pointers to b
35000 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72  -tree cells. Arr
35010 61 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f  ay szCell .** co
35020 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
35030 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
35040 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   such cell. This
35050 20 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74   function adds t
35060 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f  he.** space asso
35070 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
35080 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72   cell in the arr
35090 61 79 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ay that is curre
350a0 6e 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20  ntly stored .** 
350b0 77 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20  within the body 
350c0 6f 66 20 70 50 67 20 74 6f 20 74 68 65 20 70 50  of pPg to the pP
350d0 67 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65  g free-list. The
350e0 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61   cell-pointers a
350f0 6e 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c  nd other.** fiel
35100 64 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  ds of the page a
35110 72 65 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a  re not updated..
35120 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
35130 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
35140 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
35150 63 65 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74  cells added to t
35160 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f  he free-list..*/
35170 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
35180 46 72 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d  FreeArray(.  Mem
35190 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20  Page *pPg,      
351a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
351b0 50 61 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a  Page to edit */.
351c0 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20    int nCell,    
351d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
351e0 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64 65    /* Cells to de
351f0 6c 65 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  lete */.  u8 **a
35200 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
35210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
35220 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20  ay of cells */. 
35230 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20   u16 *szCell    
35240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35250 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
35260 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20  l sizes */.){.  
35270 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
35280 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
35290 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64   u8 * const pEnd
352a0 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70   = &aData[pPg->p
352b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
352c0 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53  .  u8 * const pS
352d0 74 61 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50  tart = &aData[pP
352e0 67 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38  g->hdrOffset + 8
352f0 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72   + pPg->childPtr
35300 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65  Size];.  int nRe
35310 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  t = 0;.  int i;.
35320 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20 30 3b    u8 *pFree = 0;
35330 0a 20 20 69 6e 74 20 73 7a 46 72 65 65 20 3d 20  .  int szFree = 
35340 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
35350 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
35360 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61 70    u8 *pCell = ap
35370 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Cell[i];.    if(
35380 20 70 43 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26   pCell>=pStart &
35390 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a  & pCell<pEnd ){.
353a0 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 73        int sz = s
353b0 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zCell[i];.      
353c0 69 66 28 20 70 46 72 65 65 21 3d 28 70 43 65 6c  if( pFree!=(pCel
353d0 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20 20 20 20  l + sz) ){.     
353e0 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a     if( pFree ){.
353f0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
35400 28 20 70 46 72 65 65 3e 61 44 61 74 61 20 26 26  ( pFree>aData &&
35410 20 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29   (pFree - aData)
35420 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
35430 20 20 20 20 66 72 65 65 53 70 61 63 65 28 70 50      freeSpace(pP
35440 67 2c 20 28 75 31 36 29 28 70 46 72 65 65 20 2d  g, (u16)(pFree -
35450 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29   aData), szFree)
35460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
35470 20 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c      pFree = pCel
35480 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65  l;.        szFre
35490 65 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20  e = sz;.        
354a0 69 66 28 20 70 46 72 65 65 2b 73 7a 3e 70 45 6e  if( pFree+sz>pEn
354b0 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
354c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
354d0 20 20 20 70 46 72 65 65 20 3d 20 70 43 65 6c 6c     pFree = pCell
354e0 3b 0a 20 20 20 20 20 20 20 20 73 7a 46 72 65 65  ;.        szFree
354f0 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a   += sz;.      }.
35500 20 20 20 20 20 20 6e 52 65 74 2b 2b 3b 0a 20 20        nRet++;.  
35510 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46    }.  }.  if( pF
35520 72 65 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ree ){.    asser
35530 74 28 20 70 46 72 65 65 3e 61 44 61 74 61 20 26  t( pFree>aData &
35540 26 20 28 70 46 72 65 65 20 2d 20 61 44 61 74 61  & (pFree - aData
35550 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 66  )<65536 );.    f
35560 72 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75  reeSpace(pPg, (u
35570 31 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74  16)(pFree - aDat
35580 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 7d  a), szFree);.  }
35590 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74 3b 0a  .  return nRet;.
355a0 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70 43 65 6c 6c 5b  }../*.** apCell[
355b0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 63  ] and szCell[] c
355c0 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
355d0 20 74 6f 20 61 6e 64 20 73 69 7a 65 73 20 6f 66   to and sizes of
355e0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 74 68   all cells in th
355f0 65 0a 2a 2a 20 70 61 67 65 73 20 62 65 69 6e 67  e.** pages being
35600 20 62 61 6c 61 6e 63 65 64 2e 20 20 54 68 65 20   balanced.  The 
35610 63 75 72 72 65 6e 74 20 70 61 67 65 2c 20 70 50  current page, pP
35620 67 2c 20 68 61 73 20 70 50 67 2d 3e 6e 43 65 6c  g, has pPg->nCel
35630 6c 20 63 65 6c 6c 73 20 73 74 61 72 74 69 6e 67  l cells starting
35640 0a 2a 2a 20 77 69 74 68 20 61 70 43 65 6c 6c 5b  .** with apCell[
35650 69 4f 6c 64 5d 2e 20 20 41 66 74 65 72 20 62 61  iOld].  After ba
35660 6c 61 6e 63 69 6e 67 2c 20 74 68 69 73 20 70 61  lancing, this pa
35670 67 65 20 73 68 6f 75 6c 64 20 68 6f 6c 64 20 6e  ge should hold n
35680 4e 65 77 20 63 65 6c 6c 73 0a 2a 2a 20 73 74 61  New cells.** sta
35690 72 74 69 6e 67 20 61 74 20 61 70 43 65 6c 6c 5b  rting at apCell[
356a0 69 4e 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iNew]..**.** Thi
356b0 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20  s routine makes 
356c0 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 61 64  the necessary ad
356d0 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 70 50 67  justments to pPg
356e0 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 74   so that it cont
356f0 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63 6f 72 72  ains.** the corr
35700 65 63 74 20 63 65 6c 6c 73 20 61 66 74 65 72 20  ect cells after 
35710 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 0a  being balanced..
35720 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 67 2d 3e 6e  **.** The pPg->n
35730 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69 6e  Free field is in
35740 76 61 6c 69 64 20 77 68 65 6e 20 74 68 69 73 20  valid when this 
35750 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
35760 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 72  . It is the.** r
35770 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
35780 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 73   the caller to s
35790 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79 2e  et it correctly.
357a0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
357b0 65 64 69 74 50 61 67 65 28 0a 20 20 4d 65 6d 50  editPage(.  MemP
357c0 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
357d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
357e0 64 69 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f  dit this page */
357f0 0a 20 20 69 6e 74 20 69 4f 6c 64 2c 20 20 20 20  .  int iOld,    
35800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35810 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
35820 69 72 73 74 20 63 65 6c 6c 20 63 75 72 72 65 6e  irst cell curren
35830 74 6c 79 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20  tly on page */. 
35840 20 69 6e 74 20 69 4e 65 77 2c 20 20 20 20 20 20   int iNew,      
35850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35860 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 77   /* Index of new
35870 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 20 70   first cell on p
35880 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65  age */.  int nNe
35890 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w,              
358a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61           /* Fina
358b0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
358c0 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75  s on page */.  u
358d0 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
358f0 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
35900 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
35910 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
35920 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
35930 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a  f cell sizes */.
35940 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  ){.  u8 * const 
35950 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
35960 74 61 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  ta;.  const int 
35970 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66  hdr = pPg->hdrOf
35980 66 73 65 74 3b 0a 20 20 75 38 20 2a 70 42 65 67  fset;.  u8 *pBeg
35990 69 6e 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c  in = &pPg->aCell
359a0 49 64 78 5b 6e 4e 65 77 20 2a 20 32 5d 3b 0a 20  Idx[nNew * 2];. 
359b0 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 50 67   int nCell = pPg
359c0 2d 3e 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 2f  ->nCell;       /
359d0 2a 20 43 65 6c 6c 73 20 73 74 6f 72 65 64 20 6f  * Cells stored o
359e0 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 70  n pPg */.  u8 *p
359f0 44 61 74 61 3b 0a 20 20 75 38 20 2a 70 43 65 6c  Data;.  u8 *pCel
35a00 6c 70 74 72 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  lptr;.  int i;. 
35a10 20 69 6e 74 20 69 4f 6c 64 45 6e 64 20 3d 20 69   int iOldEnd = i
35a20 4f 6c 64 20 2b 20 70 50 67 2d 3e 6e 43 65 6c 6c  Old + pPg->nCell
35a30 20 2b 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f   + pPg->nOverflo
35a40 77 3b 0a 20 20 69 6e 74 20 69 4e 65 77 45 6e 64  w;.  int iNewEnd
35a50 20 3d 20 69 4e 65 77 20 2b 20 6e 4e 65 77 3b 0a   = iNew + nNew;.
35a60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
35a70 45 42 55 47 0a 20 20 75 38 20 2a 70 54 6d 70 20  EBUG.  u8 *pTmp 
35a80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
35a90 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74  mpSpace(pPg->pBt
35aa0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d  ->pPager);.  mem
35ab0 63 70 79 28 70 54 6d 70 2c 20 61 44 61 74 61 2c  cpy(pTmp, aData,
35ac0 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   pPg->pBt->usabl
35ad0 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  eSize);.#endif..
35ae0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 65 6c 6c    /* Remove cell
35af0 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  s from the start
35b00 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20   and end of the 
35b10 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 69 4f  page */.  if( iO
35b20 6c 64 3c 69 4e 65 77 20 29 7b 0a 20 20 20 20 69  ld<iNew ){.    i
35b30 6e 74 20 6e 53 68 69 66 74 20 3d 20 70 61 67 65  nt nShift = page
35b40 46 72 65 65 41 72 72 61 79 28 0a 20 20 20 20 20  FreeArray(.     
35b50 20 20 20 70 50 67 2c 20 69 4e 65 77 2d 69 4f 6c     pPg, iNew-iOl
35b60 64 2c 20 26 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d  d, &apCell[iOld]
35b70 2c 20 26 73 7a 43 65 6c 6c 5b 69 4f 6c 64 5d 0a  , &szCell[iOld].
35b80 20 20 20 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f      );.    memmo
35b90 76 65 28 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  ve(pPg->aCellIdx
35ba0 2c 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78  , &pPg->aCellIdx
35bb0 5b 6e 53 68 69 66 74 2a 32 5d 2c 20 6e 43 65 6c  [nShift*2], nCel
35bc0 6c 2a 32 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  l*2);.    nCell 
35bd0 2d 3d 20 6e 53 68 69 66 74 3b 0a 20 20 7d 0a 20  -= nShift;.  }. 
35be0 20 69 66 28 20 69 4e 65 77 45 6e 64 20 3c 20 69   if( iNewEnd < i
35bf0 4f 6c 64 45 6e 64 20 29 7b 0a 20 20 20 20 6e 43  OldEnd ){.    nC
35c00 65 6c 6c 20 2d 3d 20 70 61 67 65 46 72 65 65 41  ell -= pageFreeA
35c10 72 72 61 79 28 0a 20 20 20 20 20 20 20 20 70 50  rray(.        pP
35c20 67 2c 20 69 4f 6c 64 45 6e 64 2d 69 4e 65 77 45  g, iOldEnd-iNewE
35c30 6e 64 2c 20 26 61 70 43 65 6c 6c 5b 69 4e 65 77  nd, &apCell[iNew
35c40 45 6e 64 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 4e  End], &szCell[iN
35c50 65 77 45 6e 64 5d 0a 20 20 20 20 29 3b 0a 20 20  ewEnd].    );.  
35c60 7d 0a 0a 20 20 70 44 61 74 61 20 3d 20 26 61 44  }..  pData = &aD
35c70 61 74 61 5b 67 65 74 32 62 79 74 65 4e 6f 74 5a  ata[get2byteNotZ
35c80 65 72 6f 28 26 61 44 61 74 61 5b 68 64 72 2b 35  ero(&aData[hdr+5
35c90 5d 29 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  ])];.  if( pData
35ca0 3c 70 42 65 67 69 6e 20 29 20 67 6f 74 6f 20 65  <pBegin ) goto e
35cb0 64 69 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20  ditpage_fail;.. 
35cc0 20 2f 2a 20 41 64 64 20 63 65 6c 6c 73 20 74 6f   /* Add cells to
35cd0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
35ce0 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  e page */.  if( 
35cf0 69 4e 65 77 3c 69 4f 6c 64 20 29 7b 0a 20 20 20  iNew<iOld ){.   
35d00 20 69 6e 74 20 6e 41 64 64 20 3d 20 4d 49 4e 28   int nAdd = MIN(
35d10 6e 4e 65 77 2c 69 4f 6c 64 2d 69 4e 65 77 29 3b  nNew,iOld-iNew);
35d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 69 4f  .    assert( (iO
35d30 6c 64 2d 69 4e 65 77 29 3c 6e 4e 65 77 20 7c 7c  ld-iNew)<nNew ||
35d40 20 6e 43 65 6c 6c 3d 3d 30 20 7c 7c 20 43 4f 52   nCell==0 || COR
35d50 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 70  RUPT_DB );.    p
35d60 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
35d70 43 65 6c 6c 49 64 78 3b 0a 20 20 20 20 6d 65 6d  CellIdx;.    mem
35d80 6d 6f 76 65 28 26 70 43 65 6c 6c 70 74 72 5b 6e  move(&pCellptr[n
35d90 41 64 64 2a 32 5d 2c 20 70 43 65 6c 6c 70 74 72  Add*2], pCellptr
35da0 2c 20 6e 43 65 6c 6c 2a 32 29 3b 0a 20 20 20 20  , nCell*2);.    
35db0 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72  if( pageInsertAr
35dc0 72 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 70  ray(.          p
35dd0 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70 44 61  Pg, pBegin, &pDa
35de0 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a 20 20  ta, pCellptr,.  
35df0 20 20 20 20 20 20 20 20 6e 41 64 64 2c 20 26 61          nAdd, &a
35e00 70 43 65 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a  pCell[iNew], &sz
35e10 43 65 6c 6c 5b 69 4e 65 77 5d 0a 20 20 20 20 29  Cell[iNew].    )
35e20 20 29 20 67 6f 74 6f 20 65 64 69 74 70 61 67 65   ) goto editpage
35e30 5f 66 61 69 6c 3b 0a 20 20 20 20 6e 43 65 6c 6c  _fail;.    nCell
35e40 20 2b 3d 20 6e 41 64 64 3b 0a 20 20 7d 0a 0a 20   += nAdd;.  }.. 
35e50 20 2f 2a 20 41 64 64 20 61 6e 79 20 6f 76 65 72   /* Add any over
35e60 66 6c 6f 77 20 63 65 6c 6c 73 20 2a 2f 0a 20 20  flow cells */.  
35e70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 67 2d 3e  for(i=0; i<pPg->
35e80 6e 4f 76 65 72 66 6c 6f 77 3b 20 69 2b 2b 29 7b  nOverflow; i++){
35e90 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 20 3d  .    int iCell =
35ea0 20 28 69 4f 6c 64 20 2b 20 70 50 67 2d 3e 61 69   (iOld + pPg->ai
35eb0 4f 76 66 6c 5b 69 5d 29 20 2d 20 69 4e 65 77 3b  Ovfl[i]) - iNew;
35ec0 0a 20 20 20 20 69 66 28 20 69 43 65 6c 6c 3e 3d  .    if( iCell>=
35ed0 30 20 26 26 20 69 43 65 6c 6c 3c 6e 4e 65 77 20  0 && iCell<nNew 
35ee0 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 70 74  ){.      pCellpt
35ef0 72 20 3d 20 26 70 50 67 2d 3e 61 43 65 6c 6c 49  r = &pPg->aCellI
35f00 64 78 5b 69 43 65 6c 6c 20 2a 20 32 5d 3b 0a 20  dx[iCell * 2];. 
35f10 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 70 43       memmove(&pC
35f20 65 6c 6c 70 74 72 5b 32 5d 2c 20 70 43 65 6c 6c  ellptr[2], pCell
35f30 70 74 72 2c 20 28 6e 43 65 6c 6c 20 2d 20 69 43  ptr, (nCell - iC
35f40 65 6c 6c 29 20 2a 20 32 29 3b 0a 20 20 20 20 20  ell) * 2);.     
35f50 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
35f60 69 66 28 20 70 61 67 65 49 6e 73 65 72 74 41 72  if( pageInsertAr
35f70 72 61 79 28 0a 20 20 20 20 20 20 20 20 20 20 20  ray(.           
35f80 20 70 50 67 2c 20 70 42 65 67 69 6e 2c 20 26 70   pPg, pBegin, &p
35f90 44 61 74 61 2c 20 70 43 65 6c 6c 70 74 72 2c 0a  Data, pCellptr,.
35fa0 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 26              1, &
35fb0 61 70 43 65 6c 6c 5b 69 43 65 6c 6c 20 2b 20 69  apCell[iCell + i
35fc0 4e 65 77 5d 2c 20 26 73 7a 43 65 6c 6c 5b 69 43  New], &szCell[iC
35fd0 65 6c 6c 20 2b 20 69 4e 65 77 5d 0a 20 20 20 20  ell + iNew].    
35fe0 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69 74 70    ) ) goto editp
35ff0 61 67 65 5f 66 61 69 6c 3b 0a 20 20 20 20 7d 0a  age_fail;.    }.
36000 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64    }..  /* Append
36010 20 63 65 6c 6c 73 20 74 6f 20 74 68 65 20 65 6e   cells to the en
36020 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
36030 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20 26 70  .  pCellptr = &p
36040 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 43 65  Pg->aCellIdx[nCe
36050 6c 6c 2a 32 5d 3b 0a 20 20 69 66 28 20 70 61 67  ll*2];.  if( pag
36060 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20  eInsertArray(.  
36070 20 20 20 20 20 20 70 50 67 2c 20 70 42 65 67 69        pPg, pBegi
36080 6e 2c 20 26 70 44 61 74 61 2c 20 70 43 65 6c 6c  n, &pData, pCell
36090 70 74 72 2c 0a 20 20 20 20 20 20 20 20 6e 4e 65  ptr,.        nNe
360a0 77 2d 6e 43 65 6c 6c 2c 20 26 61 70 43 65 6c 6c  w-nCell, &apCell
360b0 5b 69 4e 65 77 2b 6e 43 65 6c 6c 5d 2c 20 26 73  [iNew+nCell], &s
360c0 7a 43 65 6c 6c 5b 69 4e 65 77 2b 6e 43 65 6c 6c  zCell[iNew+nCell
360d0 5d 0a 20 20 29 20 29 20 67 6f 74 6f 20 65 64 69  ].  ) ) goto edi
360e0 74 70 61 67 65 5f 66 61 69 6c 3b 0a 0a 20 20 70  tpage_fail;..  p
360f0 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 4e 65 77  Pg->nCell = nNew
36100 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ;.  pPg->nOverfl
36110 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62  ow = 0;..  put2b
36120 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33  yte(&aData[hdr+3
36130 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a  ], pPg->nCell);.
36140 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
36150 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20  a[hdr+5], pData 
36160 2d 20 61 44 61 74 61 29 3b 0a 0a 23 69 66 64 65  - aData);..#ifde
36170 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
36180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
36190 20 26 26 20 21 43 4f 52 52 55 50 54 5f 44 42 3b   && !CORRUPT_DB;
361a0 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
361b0 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 2b  Cell = apCell[i+
361c0 69 4e 65 77 5d 3b 0a 20 20 20 20 69 6e 74 20 69  iNew];.    int i
361d0 4f 66 66 20 3d 20 67 65 74 32 62 79 74 65 28 26  Off = get2byte(&
361e0 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78 5b 69 2a  pPg->aCellIdx[i*
361f0 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 43 65  2]);.    if( pCe
36200 6c 6c 3e 3d 61 44 61 74 61 20 26 26 20 70 43 65  ll>=aData && pCe
36210 6c 6c 3c 26 61 44 61 74 61 5b 70 50 67 2d 3e 70  ll<&aData[pPg->p
36220 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20  Bt->usableSize] 
36230 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  ){.      pCell =
36240 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61   &pTmp[pCell - a
36250 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Data];.    }.   
36260 20 61 73 73 65 72 74 28 20 30 3d 3d 6d 65 6d 63   assert( 0==memc
36270 6d 70 28 70 43 65 6c 6c 2c 20 26 61 44 61 74 61  mp(pCell, &aData
36280 5b 69 4f 66 66 5d 2c 20 73 7a 43 65 6c 6c 5b 69  [iOff], szCell[i
36290 2b 69 4e 65 77 5d 29 20 29 3b 0a 20 20 7d 0a 23  +iNew]) );.  }.#
362a0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 3b  endif..  return;
362b0 0a 20 65 64 69 74 70 61 67 65 5f 66 61 69 6c 3a  . editpage_fail:
362c0 0a 20 20 2f 2a 20 55 6e 61 62 6c 65 20 74 6f 20  .  /* Unable to 
362d0 65 64 69 74 20 74 68 69 73 20 70 61 67 65 2e 20  edit this page. 
362e0 52 65 62 75 69 6c 64 20 69 74 20 66 72 6f 6d 20  Rebuild it from 
362f0 73 63 72 61 74 63 68 20 69 6e 73 74 65 61 64 2e  scratch instead.
36300 20 2a 2f 0a 20 20 72 65 62 75 69 6c 64 50 61 67   */.  rebuildPag
36310 65 28 70 50 67 2c 20 6e 4e 65 77 2c 20 26 61 70  e(pPg, nNew, &ap
36320 43 65 6c 6c 5b 69 4e 65 77 5d 2c 20 26 73 7a 43  Cell[iNew], &szC
36330 65 6c 6c 5b 69 4e 65 77 5d 29 3b 0a 7d 0a 0a 2f  ell[iNew]);.}../
36340 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
36350 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
36360 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
36370 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
36380 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
36390 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
363a0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
363b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
363c0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
363d0 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
363e0 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
363f0 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
36400 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
36410 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
36420 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
36430 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
36440 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
36450 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
36460 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
36470 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
36480 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
36490 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
364a0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
364b0 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
364c0 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
364d0 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
364e0 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
364f0 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
36500 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
36510 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
36520 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
36530 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
36540 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
36550 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
36560 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
36570 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
36580 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
36590 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
365a0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
365b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
365c0 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
365d0 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
365e0 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
365f0 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
36600 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
36610 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
36620 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
36630 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  /...#ifndef SQLI
36640 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c  TE_OMIT_QUICKBAL
36650 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ANCE./*.** This 
36660 76 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e  version of balan
36670 63 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65  ce() handles the
36680 20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20   common special 
36690 63 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20  case where.** a 
366a0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69  new entry is bei
366b0 6e 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74  ng inserted on t
366c0 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74  he extreme right
366d0 2d 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74  -end of the.** t
366e0 72 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f  ree, in other wo
366f0 72 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65  rds, when the ne
36700 77 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63  w entry will bec
36710 6f 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a  ome the largest.
36720 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
36730 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74  tree..**.** Inst
36740 65 61 64 20 6f 66 20 74 72 79 69 6e 67 20 74 6f  ead of trying to
36750 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20 72   balance the 3 r
36760 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 70  ight-most leaf p
36770 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a 2a  ages, just add.*
36780 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20  * a new page to 
36790 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
367a0 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65 20  ide and put the 
367b0 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  one new entry in
367c0 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20 20  .** that page.  
367d0 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65 20  This leaves the 
367e0 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74 68  right side of th
367f0 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74 0a  e tree somewhat.
36800 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20 20  ** unbalanced.  
36810 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68 61  But odds are tha
36820 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e 73  t we will be ins
36830 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72 69  erting new entri
36840 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
36850 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64 73   soon afterwards
36860 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20 65   so the nearly e
36870 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20 71  mpty page will q
36880 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75  uickly.** fill u
36890 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e 0a  p.  On average..
368a0 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20 74  **.** pPage is t
368b0 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68 69  he leaf page whi
368c0 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ch is the right-
368d0 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  most page in the
368e0 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65 6e   tree..** pParen
368f0 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74 2e  t is its parent.
36900 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61 76    pPage must hav
36910 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72 66  e a single overf
36920 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68 69  low entry.** whi
36930 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20 72  ch is also the r
36940 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
36950 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a  on the page..**.
36960 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  ** The pSpace bu
36970 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  ffer is used to 
36980 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61 72  store a temporar
36990 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64 69  y copy of the di
369a0 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74 68  vider.** cell th
369b0 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72  at will be inser
369c0 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e 74  ted into pParent
369d0 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63 6f  . Such a cell co
369e0 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a 2a  nsists of a 4.**
369f0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
36a00 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  r followed by a 
36a10 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
36a20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68 65  integer. In othe
36a30 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20 6d  r.** words, at m
36a40 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48 65  ost 13 bytes. He
36a50 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20 62  nce the pSpace b
36a60 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61 74  uffer must be at
36a70 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79 74  .** least 13 byt
36a80 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
36a90 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
36aa0 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65 20  e_quick(MemPage 
36ab0 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61 67  *pParent, MemPag
36ac0 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 53  e *pPage, u8 *pS
36ad0 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72 65  pace){.  BtShare
36ae0 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20 70  d *const pBt = p
36af0 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Page->pBt;    /*
36b00 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73 65   B-Tree Database
36b10 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
36b20 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
36b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
36b40 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  wly allocated pa
36b50 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
36b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36b80 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
36b90 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20 20   Pgno pgnoNew;  
36ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36bb0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
36bc0 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f 0a  mber of pNew */.
36bd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36be0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
36bf0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
36c00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
36c10 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
36c20 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70  eable(pParent->p
36c30 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
36c40 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
36c50 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20 2f  rflow==1 );..  /
36c60 2a 20 54 68 69 73 20 65 72 72 6f 72 20 63 6f 6e  * This error con
36c70 64 69 74 69 6f 6e 20 69 73 20 6e 6f 77 20 63 61  dition is now ca
36c80 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65  ught prior to re
36c90 61 63 68 69 6e 67 20 74 68 69 73 20 66 75 6e 63  aching this func
36ca0 74 69 6f 6e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  tion */.  if( NE
36cb0 56 45 52 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  VER(pPage->nCell
36cc0 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 53 51  ==0) ) return SQ
36cd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
36ce0 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  T;..  /* Allocat
36cf0 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68  e a new page. Th
36d00 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63  is page will bec
36d10 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69  ome the right-si
36d20 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70  bling of .  ** p
36d30 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70  Page. Make the p
36d40 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61  arent page writa
36d50 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65  ble, so that the
36d60 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
36d70 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  l.  ** may be in
36d80 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20  serted. If both 
36d90 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73  these operations
36da0 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c   are successful,
36db0 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20   proceed..  */. 
36dc0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
36dd0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
36de0 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c  ew, &pgnoNew, 0,
36df0 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d   0);..  if( rc==
36e00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20  SQLITE_OK ){..  
36e10 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53    u8 *pOut = &pS
36e20 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20  pace[4];.    u8 
36e30 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e  *pCell = pPage->
36e40 61 70 4f 76 66 6c 5b 30 5d 3b 0a 20 20 20 20 75  apOvfl[0];.    u
36e50 31 36 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c  16 szCell = cell
36e60 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
36e70 43 65 6c 6c 29 3b 0a 20 20 20 20 75 38 20 2a 70  Cell);.    u8 *p
36e80 53 74 6f 70 3b 0a 0a 20 20 20 20 61 73 73 65 72  Stop;..    asser
36e90 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
36ea0 73 77 72 69 74 65 61 62 6c 65 28 70 4e 65 77 2d  swriteable(pNew-
36eb0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
36ec0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
36ed0 61 44 61 74 61 5b 30 5d 3d 3d 28 50 54 46 5f 49  aData[0]==(PTF_I
36ee0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41  NTKEY|PTF_LEAFDA
36ef0 54 41 7c 50 54 46 5f 4c 45 41 46 29 20 29 3b 0a  TA|PTF_LEAF) );.
36f00 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
36f10 77 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  w, PTF_INTKEY|PT
36f20 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c  F_LEAFDATA|PTF_L
36f30 45 41 46 29 3b 0a 20 20 20 20 72 65 62 75 69 6c  EAF);.    rebuil
36f40 64 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26  dPage(pNew, 1, &
36f50 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b  pCell, &szCell);
36f60 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 46 72 65 65  .    pNew->nFree
36f70 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
36f80 7a 65 20 2d 20 70 4e 65 77 2d 3e 63 65 6c 6c 4f  ze - pNew->cellO
36f90 66 66 73 65 74 20 2d 20 32 20 2d 20 73 7a 43 65  ffset - 2 - szCe
36fa0 6c 6c 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ll;..    /* If t
36fb0 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
36fc0 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
36fd0 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
36fe0 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20 77 69  er map.    ** wi
36ff0 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  th entries for t
37000 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64  he new page, and
37010 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f   any pointer fro
37020 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 65  m the .    ** ce
37030 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
37040 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
37050 67 65 2e 20 49 66 20 65 69 74 68 65 72 20 6f 66  ge. If either of
37060 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 6f 70   these.    ** op
37070 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73 2c 20  erations fails, 
37080 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  the return code 
37090 69 73 20 73 65 74 2c 20 62 75 74 20 74 68 65 20  is set, but the 
370a0 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a 2a 20  contents.    ** 
370b0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  of the parent pa
370c0 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d 61 6e  ge are still man
370d0 69 70 75 6c 61 74 65 64 20 62 79 20 74 68 68 20  ipulated by thh 
370e0 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20 20 20  code below..    
370f0 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c 20 61  ** That is Ok, a
37100 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
37110 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
37120 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a 20 20  guaranteed to.  
37130 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
37140 73 20 64 69 72 74 79 2e 20 52 65 74 75 72 6e 69  s dirty. Returni
37150 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ng an error code
37160 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a 20 20   will cause a.  
37170 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c 20 75    ** rollback, u
37180 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61 6e 67  ndoing any chang
37190 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65 20 70  es made to the p
371a0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
371b0 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
371c0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
371d0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
371e0 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f  pgnoNew, PTRMAP_
371f0 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
37200 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
37210 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70 4e 65    if( szCell>pNe
37220 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 29 7b 0a 20  w->minLocal ){. 
37230 20 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74         ptrmapPut
37240 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 70 43  OvflPtr(pNew, pC
37250 65 6c 6c 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  ell, &rc);.     
37260 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
37270 2f 2a 20 43 72 65 61 74 65 20 61 20 64 69 76 69  /* Create a divi
37280 64 65 72 20 63 65 6c 6c 20 74 6f 20 69 6e 73 65  der cell to inse
37290 72 74 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 2e  rt into pParent.
372a0 20 54 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   The divider cel
372b0 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74  l.    ** consist
372c0 73 20 6f 66 20 61 20 34 2d 62 79 74 65 20 70 61  s of a 4-byte pa
372d0 67 65 20 6e 75 6d 62 65 72 20 28 74 68 65 20 70  ge number (the p
372e0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 50  age number of pP
372f0 61 67 65 29 20 61 6e 64 0a 20 20 20 20 2a 2a 20  age) and.    ** 
37300 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74  a variable lengt
37310 68 20 6b 65 79 20 76 61 6c 75 65 20 28 77 68 69  h key value (whi
37320 63 68 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  ch must be the s
37330 61 6d 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ame value as the
37340 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 73 74 20  .    ** largest 
37350 6b 65 79 20 6f 6e 20 70 50 61 67 65 29 2e 0a 20  key on pPage).. 
37360 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 6f 20     **.    ** To 
37370 66 69 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74  find the largest
37380 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e 20 70 50   key value on pP
37390 61 67 65 2c 20 66 69 72 73 74 20 66 69 6e 64 20  age, first find 
373a0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 0a  the right-most .
373b0 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70      ** cell on p
373c0 50 61 67 65 2e 20 54 68 65 20 66 69 72 73 74 20  Page. The first 
373d0 74 77 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  two fields of th
373e0 69 73 20 63 65 6c 6c 20 61 72 65 20 74 68 65 20  is cell are the 
373f0 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 2d 6c  .    ** record-l
37400 65 6e 67 74 68 20 28 61 20 76 61 72 69 61 62 6c  ength (a variabl
37410 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
37420 20 61 74 20 6d 6f 73 74 20 33 32 2d 62 69 74 73   at most 32-bits
37430 20 69 6e 20 73 69 7a 65 29 0a 20 20 20 20 2a 2a   in size).    **
37440 20 61 6e 64 20 74 68 65 20 6b 65 79 20 76 61 6c   and the key val
37450 75 65 20 28 61 20 76 61 72 69 61 62 6c 65 20 6c  ue (a variable l
37460 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2c 20 6d  ength integer, m
37470 61 79 20 68 61 76 65 20 61 6e 79 20 76 61 6c 75  ay have any valu
37480 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 66  e)..    ** The f
37490 69 72 73 74 20 6f 66 20 74 68 65 20 77 68 69 6c  irst of the whil
374a0 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20 62 65 6c  e(...) loops bel
374b0 6f 77 20 73 6b 69 70 73 20 6f 76 65 72 20 74 68  ow skips over th
374c0 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 0a  e record-length.
374d0 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e 20 54 68      ** field. Th
374e0 65 20 73 65 63 6f 6e 64 20 77 68 69 6c 65 28 2e  e second while(.
374f0 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69 65 73 20  ..) loop copies 
37500 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 66 72  the key value fr
37510 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 65  om the.    ** ce
37520 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69 6e 74 6f  ll on pPage into
37530 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
37540 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  er..    */.    p
37550 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
37560 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
37570 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70 53 74 6f  ell-1);.    pSto
37580 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20  p = &pCell[9];. 
37590 20 20 20 77 68 69 6c 65 28 20 28 2a 28 70 43 65     while( (*(pCe
375a0 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26 26 20 70  ll++)&0x80) && p
375b0 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b 0a 20 20  Cell<pStop );.  
375c0 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
375d0 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
375e0 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d 20 2a 28  ((*(pOut++) = *(
375f0 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38 30 29 20  pCell++))&0x80) 
37600 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29  && pCell<pStop )
37610 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74  ;..    /* Insert
37620 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
37630 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50 61 72 65   cell into pPare
37640 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 73 65 72  nt. */.    inser
37650 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  tCell(pParent, p
37660 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c 20 70  Parent->nCell, p
37670 53 70 61 63 65 2c 20 28 69 6e 74 29 28 70 4f 75  Space, (int)(pOu
37680 74 2d 70 53 70 61 63 65 29 2c 0a 20 20 20 20 20  t-pSpace),.     
37690 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 50 61            0, pPa
376a0 67 65 2d 3e 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  ge->pgno, &rc);.
376b0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
376c0 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e  right-child poin
376d0 74 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74  ter of pParent t
376e0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
376f0 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
37700 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
37710 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
37720 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
37730 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20  pgnoNew);.  .   
37740 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
37750 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
37760 20 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20   new page. */.  
37770 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
37780 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ew);.  }..  retu
37790 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
377a0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  /* SQLITE_OMIT_Q
377b0 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a  UICKBALANCE */..
377c0 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73  #if 0./*.** This
377d0 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
377e0 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e  ot contribute an
377f0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70  ything to the op
37800 65 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74  eration of SQLit
37810 65 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65  e..** it is some
37820 74 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20  times activated 
37830 74 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c  temporarily whil
37840 65 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65  e debugging code
37850 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a   responsible .**
37860 20 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69   for setting poi
37870 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
37880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37890 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
378a0 28 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67  (MemPage **apPag
378b0 65 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20  e, int nPage){. 
378c0 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
378d0 28 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69  (i=0; i<nPage; i
378e0 2b 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b  ++){.    Pgno n;
378f0 0a 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d  .    u8 e;.    M
37900 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
37910 61 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42  apPage[i];.    B
37920 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
37930 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61  Page->pBt;.    a
37940 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
37950 49 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72  Init );..    for
37960 28 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e  (j=0; j<pPage->n
37970 43 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Cell; j++){.    
37980 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
37990 0a 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20  .      u8 *z;.  
379a0 20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69     .      z = fi
379b0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29  ndCell(pPage, j)
379c0 3b 0a 20 20 20 20 20 20 62 74 72 65 65 50 61 72  ;.      btreePar
379d0 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
379e0 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20   z, &info);.    
379f0 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72    if( info.iOver
37a00 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
37a10 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
37a20 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f 76  byte(&z[info.iOv
37a30 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
37a40 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c    ptrmapGet(pBt,
37a50 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b 0a   ovfl, &e, &n);.
37a60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
37a70 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 26  n==pPage->pgno &
37a80 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  & e==PTRMAP_OVER
37a90 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20 7d  FLOW1 );.      }
37aa0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
37ab0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
37ac0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d 20     Pgno child = 
37ad0 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20 20  get4byte(z);.   
37ae0 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
37af0 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
37b00 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
37b10 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
37b20 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
37b30 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20 7d  BTREE );.      }
37b40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
37b50 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
37b60 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20       Pgno child 
37b70 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
37b80 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
37b90 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
37ba0 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
37bb0 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20 26  Bt, child, &e, &
37bc0 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  n);.      assert
37bd0 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ( n==pPage->pgno
37be0 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42 54   && e==PTRMAP_BT
37bf0 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  REE );.    }.  }
37c00 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
37c10 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
37c20 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
37c30 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20 63  ed to copy the c
37c40 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
37c50 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72 65  -tree node store
37c60 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70 46  d .** on page pF
37c70 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e  rom to page pTo.
37c80 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20 77   If page pFrom w
37c90 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61  as not a leaf pa
37ca0 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ge, then.** the 
37cb0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
37cc0 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68 69  ies for each chi
37cd0 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64 61  ld page are upda
37ce0 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 0a  ted so that the.
37cf0 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20 73  ** parent page s
37d00 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f 69  tored in the poi
37d10 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67 65  nter map is page
37d20 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20 63   pTo. If pFrom c
37d30 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79 20  ontained.** any 
37d40 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72 66  cells with overf
37d50 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
37d60 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72 72  s, then the corr
37d70 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74 65  esponding pointe
37d80 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
37d90 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74 65   are also update
37da0 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  d so that the pa
37db0 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61 67  rent page is pag
37dc0 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  e pTo..**.** If 
37dd0 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e 74  pFrom is current
37de0 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79 20  ly carrying any 
37df0 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 28  overflow cells (
37e00 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a 2a  entries in the.*
37e10 2a 20 4d 65 6d 50 61 67 65 2e 61 70 4f 76 66 6c  * MemPage.apOvfl
37e20 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20  [] array), they 
37e30 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74  are not copied t
37e40 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65  o pTo. .**.** Be
37e50 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
37e60 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e  page pTo is rein
37e70 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20  itialized using 
37e80 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e  btreeInitPage().
37e90 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 65 72 66 6f  .**.** The perfo
37ea0 72 6d 61 6e 63 65 20 6f 66 20 74 68 69 73 20 66  rmance of this f
37eb0 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63  unction is not c
37ec0 72 69 74 69 63 61 6c 2e 20 49 74 20 69 73 20 6f  ritical. It is o
37ed0 6e 6c 79 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  nly used by .** 
37ee0 74 68 65 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  the balance_shal
37ef0 6c 6f 77 65 72 28 29 20 61 6e 64 20 62 61 6c 61  lower() and bala
37f00 6e 63 65 5f 64 65 65 70 65 72 28 29 20 70 72 6f  nce_deeper() pro
37f10 63 65 64 75 72 65 73 2c 20 6e 65 69 74 68 65 72  cedures, neither
37f20 20 6f 66 0a 2a 2a 20 77 68 69 63 68 20 61 72 65   of.** which are
37f30 20 63 61 6c 6c 65 64 20 6f 66 74 65 6e 20 75 6e   called often un
37f40 64 65 72 20 6e 6f 72 6d 61 6c 20 63 69 72 63 75  der normal circu
37f50 6d 73 74 61 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61  mstances..*/.sta
37f60 74 69 63 20 76 6f 69 64 20 63 6f 70 79 4e 6f 64  tic void copyNod
37f70 65 43 6f 6e 74 65 6e 74 28 4d 65 6d 50 61 67 65  eContent(MemPage
37f80 20 2a 70 46 72 6f 6d 2c 20 4d 65 6d 50 61 67 65   *pFrom, MemPage
37f90 20 2a 70 54 6f 2c 20 69 6e 74 20 2a 70 52 43 29   *pTo, int *pRC)
37fa0 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d 3d  {.  if( (*pRC)==
37fb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
37fc0 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73   BtShared * cons
37fd0 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70  t pBt = pFrom->p
37fe0 42 74 3b 0a 20 20 20 20 75 38 20 2a 20 63 6f 6e  Bt;.    u8 * con
37ff0 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  st aFrom = pFrom
38000 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 75 38 20  ->aData;.    u8 
38010 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54  * const aTo = pT
38020 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 6e  o->aData;.    in
38030 74 20 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72  t const iFromHdr
38040 20 3d 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66   = pFrom->hdrOff
38050 73 65 74 3b 0a 20 20 20 20 69 6e 74 20 63 6f 6e  set;.    int con
38060 73 74 20 69 54 6f 48 64 72 20 3d 20 28 28 70 54  st iToHdr = ((pT
38070 6f 2d 3e 70 67 6e 6f 3d 3d 31 29 20 3f 20 31 30  o->pgno==1) ? 10
38080 30 20 3a 20 30 29 3b 0a 20 20 20 20 69 6e 74 20  0 : 0);.    int 
38090 72 63 3b 0a 20 20 20 20 69 6e 74 20 69 44 61 74  rc;.    int iDat
380a0 61 3b 0a 20 20 0a 20 20 0a 20 20 20 20 61 73 73  a;.  .  .    ass
380b0 65 72 74 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e  ert( pFrom->isIn
380c0 69 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  it );.    assert
380d0 28 20 70 46 72 6f 6d 2d 3e 6e 46 72 65 65 3e 3d  ( pFrom->nFree>=
380e0 69 54 6f 48 64 72 20 29 3b 0a 20 20 20 20 61 73  iToHdr );.    as
380f0 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26  sert( get2byte(&
38100 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 2b 35  aFrom[iFromHdr+5
38110 5d 29 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  ]) <= (int)pBt->
38120 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
38130 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
38140 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e   b-tree node con
38150 74 65 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70  tent from page p
38160 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
38170 2e 20 2a 2f 0a 20 20 20 20 69 44 61 74 61 20 3d  . */.    iData =
38180 20 67 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d   get2byte(&aFrom
38190 5b 69 46 72 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20  [iFromHdr+5]);. 
381a0 20 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69     memcpy(&aTo[i
381b0 44 61 74 61 5d 2c 20 26 61 46 72 6f 6d 5b 69 44  Data], &aFrom[iD
381c0 61 74 61 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c  ata], pBt->usabl
381d0 65 53 69 7a 65 2d 69 44 61 74 61 29 3b 0a 20 20  eSize-iData);.  
381e0 20 20 6d 65 6d 63 70 79 28 26 61 54 6f 5b 69 54    memcpy(&aTo[iT
381f0 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d 5b 69 46  oHdr], &aFrom[iF
38200 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f 6d 2d 3e  romHdr], pFrom->
38210 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
38220 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  From->nCell);.  
38230 0a 20 20 20 20 2f 2a 20 52 65 69 6e 69 74 69 61  .    /* Reinitia
38240 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f  lize page pTo so
38250 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
38260 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ts of the MemPag
38270 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  e structure.    
38280 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
38290 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
382a0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
382b0 20 63 61 6e 20 61 63 74 75 61 6c 6c 79 20 66 61   can actually fa
382c0 69 6c 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  il under.    ** 
382d0 66 61 69 72 6c 79 20 6f 62 73 63 75 72 65 20 63  fairly obscure c
382e0 69 72 63 75 6d 73 74 61 6e 63 65 73 2c 20 65 76  ircumstances, ev
382f0 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  en though it is 
38300 61 20 63 6f 70 79 20 6f 66 20 69 6e 69 74 69 61  a copy of initia
38310 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 70 61  lized .    ** pa
38320 67 65 20 70 46 72 6f 6d 2e 0a 20 20 20 20 2a 2f  ge pFrom..    */
38330 0a 20 20 20 20 70 54 6f 2d 3e 69 73 49 6e 69 74  .    pTo->isInit
38340 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 62   = 0;.    rc = b
38350 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 54 6f  treeInitPage(pTo
38360 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
38370 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
38380 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
38390 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
383a0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
383b0 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
383c0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
383d0 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
383e0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r-map entries.  
383f0 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74    ** for any b-t
38400 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ree or overflow 
38410 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e  pages that pTo n
38420 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
38430 70 6f 69 6e 74 65 72 73 20 74 6f 2e 0a 20 20 20  pointers to..   
38440 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55   */.    if( ISAU
38450 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
38460 20 20 2a 70 52 43 20 3d 20 73 65 74 43 68 69 6c    *pRC = setChil
38470 64 50 74 72 6d 61 70 73 28 70 54 6f 29 3b 0a 20  dPtrmaps(pTo);. 
38480 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
3