/ Hex Artifact Content
Login

Artifact bb23e5470ec0c9b9ae8e17c86cb686bc4112642d8f457bd42b3b3727d5ef78be:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b   */.    void *pK
5a40: 65 79 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b  ey;.    pCur->nK
5a50: 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ey = sqlite3Btre
5a60: 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75  ePayloadSize(pCu
5a70: 72 29 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73  r);.    pKey = s
5a80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43  qlite3Malloc( pC
5a90: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
5aa0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
5ab0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
5ac0: 72 65 65 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  reePayload(pCur,
5ad0: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
5ae0: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
5af0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
5b10: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
5b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
5b30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
5b40: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
5b50: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5b60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
5b70: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
5b80: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5b90: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
5ba0: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5bb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5bd0: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5be0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5bf0: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5c00: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
5c10: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
5c20: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
5c30: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
5c40: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
5c50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
5c60: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
5c70: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
5c80: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
5c90: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5ca0: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
5cb0: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5cc0: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5cd0: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5ce0: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5cf0: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5d00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
5d10: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
5d20: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
5d30: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
5d40: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
5d50: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
5d60: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
5d70: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5d80: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
5d90: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5da0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5db0: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5dc0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5dd0: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5de0: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5df0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5e00: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
5e10: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
5e20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e30: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
5e40: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
5e50: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
5e60: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5e70: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5e80: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5e90: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5ea0: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5eb0: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5ec0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5ed0: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5ee0: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5ef0: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5f00: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
5f10: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
5f20: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
5f30: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5f40: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
5f50: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
5f60: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5f70: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5f80: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5f90: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5fa0: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5fb0: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5fc0: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5fd0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5fe0: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5ff0: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
6000: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
6010: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
6020: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
6030: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
6040: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
6050: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
6060: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
6070: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
6080: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
6090: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
60a0: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
60b0: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
60c0: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
60d0: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
60e0: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
60f0: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
6100: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
6110: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
6120: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
6130: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
6140: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
6150: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
6160: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
6170: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
6180: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
6190: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
61a0: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
61b0: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
61c0: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
61d0: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
61e0: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
61f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
6200: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
6210: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
6220: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
6230: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
6240: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
6250: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
6260: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
6270: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
6280: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
6290: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
62a0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
62b0: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
62c0: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
62d0: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
62e0: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
62f0: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
6300: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
6310: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
6320: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6330: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
6340: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
6350: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
6360: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
6370: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
6380: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
6390: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
63a0: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
63b0: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
63c0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
63d0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
63e0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
63f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6400: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
6410: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
6420: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
6430: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
6440: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
6450: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6460: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6470: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6480: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
6490: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
64a0: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
64b0: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
64c0: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
64d0: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
64e0: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
64f0: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
6500: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6510: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
6520: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
6530: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
6540: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
6550: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
6560: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
6570: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
6580: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
6590: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
65a0: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
65b0: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
65c0: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
65d0: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
65e0: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
65f0: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
6600: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
6610: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
6620: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
6630: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
6640: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
6650: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
6660: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6670: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6690: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
66a0: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
66b0: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
66c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
66d0: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
66e0: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
66f0: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6700: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
6710: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
6720: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
6730: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
6740: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
6750: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
6760: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6770: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
6780: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
6790: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
67a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
67b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
67c0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
67d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
67e0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
67f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6800: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
6810: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
6820: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6830: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6840: 70 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20  p->iPage>=0 );. 
6850: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65         btreeRele
6860: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
6870: 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s(p);.      }.  
6880: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70    }.    p = p->p
6890: 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20  Next;.  }while( 
68a0: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  p );.  return SQ
68b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
68c0: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
68d0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
68e0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
68f0: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
6900: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
6910: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
6920: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
6930: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
6940: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
6950: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
6960: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
6970: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
6980: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
6990: 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
69a0: 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
69b0: 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
69c0: 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
69d0: 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
69e0: 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
69f0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
6a00: 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
6a10: 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
6a20: 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
6a30: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
6a40: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
6a70: 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
6a80: 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
6a90: 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
6aa0: 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
6ab0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
6ac0: 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
6ad0: 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
6ae0: 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
6af0: 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
6b00: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
6b10: 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
6b20: 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
6b30: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
6b40: 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
6b50: 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
6b60: 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
6b70: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
6b80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6b90: 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
6ba0: 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
6bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
6bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
6bd0: 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
6be0: 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
6bf0: 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
6c00: 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
6c10: 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  /..  if( pKey ){
6c20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
6c30: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
6c40: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
6c50: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
6c60: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
6c70: 64 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  d(pCur->pKeyInfo
6c80: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
6c90: 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
6ca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
6cb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6cc0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43  eRecordUnpack(pC
6cd0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69  ur->pKeyInfo, (i
6ce0: 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70  nt)nKey, pKey, p
6cf0: 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66 28  IdxKey);.    if(
6d00: 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64   pIdxKey->nField
6d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
6d20: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
6d30: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
6d40: 6f 20 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3b 0a 20  o moveto_done;. 
6d50: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
6d60: 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20    pIdxKey = 0;. 
6d70: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
6d80: 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
6d90: 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b  cked(pCur, pIdxK
6da0: 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20  ey, nKey, bias, 
6db0: 70 52 65 73 29 3b 0a 6d 6f 76 65 74 6f 5f 64 6f  pRes);.moveto_do
6dc0: 6e 65 3a 0a 20 20 69 66 28 20 70 49 64 78 4b 65  ne:.  if( pIdxKe
6dd0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
6de0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
6df0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 49 64 78 4b  yInfo->db, pIdxK
6e00: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
6e10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
6e20: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
6e30: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
6e40: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
6e50: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
6e60: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
6e70: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6e80: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
6e90: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
6ea0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
6eb0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
6ec0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
6ed0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
6ee0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
6ef0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
6f00: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
6f10: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
6f20: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
6f30: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
6f40: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
6f50: 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n()..*/.static i
6f60: 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65 43  nt btreeRestoreC
6f70: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
6f80: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6f90: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 73   int rc;.  int s
6fa0: 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65 72  kipNext;.  asser
6fb0: 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
6fc0: 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
6fd0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6fe0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6ff0: 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
7000: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
7010: 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b  =CURSOR_FAULT ){
7020: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72  .    return pCur
7030: 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a  ->skipNext;.  }.
7040: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
7050: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
7060: 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f 76  .  rc = btreeMov
7070: 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d 3e  eto(pCur, pCur->
7080: 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79  pKey, pCur->nKey
7090: 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b  , 0, &skipNext);
70a0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
70b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
70c0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
70d0: 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Key);.    pCur->
70e0: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73  pKey = 0;.    as
70f0: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
7100: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7110: 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
7120: 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
7130: 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b   );.    pCur->sk
7140: 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e 65  ipNext |= skipNe
7150: 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72  xt;.    if( pCur
7160: 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43  ->skipNext && pC
7170: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
7180: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
7190: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
71a0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
71c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66  turn rc;.}..#def
71d0: 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ine restoreCurso
71e0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20  rPosition(p) \. 
71f0: 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52   (p->eState>=CUR
7200: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7210: 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72  ? \.         btr
7220: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
7230: 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20  osition(p) : \. 
7240: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7250: 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  K)../*.** Determ
7260: 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
7270: 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20  ot a cursor has 
7280: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
7290: 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  osition where.**
72a0: 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61   it was last pla
72b0: 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e  ced, or has been
72c0: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72   invalidated for
72d0: 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f   any other reaso
72e0: 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61  n..** Cursors ca
72f0: 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20  n move when the 
7300: 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69  row they are poi
7310: 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65  nting at is dele
7320: 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20  ted out.** from 
7330: 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20  under them, for 
7340: 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72  example.  Cursor
7350: 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65   might also move
7360: 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69   if a btree.** i
7370: 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a  s rebalanced..**
7380: 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
7390: 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20   routine with a 
73a0: 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e  NULL cursor poin
73b0: 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ter returns fals
73c0: 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  e..**.** Use the
73d0: 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65   separate sqlite
73e0: 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
73f0: 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f  ore() routine to
7400: 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f   restore a curso
7410: 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65  r.** back to whe
7420: 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62  re it ought to b
7430: 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  e if this routin
7440: 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a  e returns true..
7450: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7460: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7470: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
7480: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
7490: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
74a0: 54 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c  T(pCur).       |
74b0: 7c 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42  | pCur==sqlite3B
74c0: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
74d0: 73 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72  sor() );.  asser
74e0: 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  t( offsetof(BtCu
74f0: 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30  rsor, eState)==0
7500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69   );.  assert( si
7510: 7a 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74  zeof(pCur->eStat
7520: 65 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72  e)==1 );.  retur
7530: 6e 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21  n CURSOR_VALID !
7540: 3d 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a  = *(u8*)pCur;.}.
7550: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
7560: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b  pointer to a fak
7570: 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
7580: 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61  t that will alwa
7590: 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c  ys answer.** fal
75a0: 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  se to the sqlite
75b0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
75c0: 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61  oved() routine a
75d0: 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a  bove.  The fake.
75e0: 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e  ** cursor return
75f0: 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75  ed must not be u
7600: 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68  sed with any oth
7610: 65 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61  er Btree interfa
7620: 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20  ce..*/.BtCursor 
7630: 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b  *sqlite3BtreeFak
7640: 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69  eValidCursor(voi
7650: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20  d){.  static u8 
7660: 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52  fakeCursor = CUR
7670: 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73  SOR_VALID;.  ass
7680: 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74  ert( offsetof(Bt
7690: 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d  Cursor, eState)=
76a0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
76b0: 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43  BtCursor*)&fakeC
76c0: 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ursor;.}../*.** 
76d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73  This routine res
76e0: 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62  tores a cursor b
76f0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
7700: 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74  nal position aft
7710: 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65  er it.** has bee
7720: 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20  n moved by some 
7730: 6f 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79  outside activity
7740: 20 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65   (such as a btre
7750: 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a  e rebalance or.*
7760: 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62  * a row having b
7770: 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20  een deleted out 
7780: 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
7790: 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  ursor).  .**.** 
77a0: 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20  On success, the 
77b0: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70  *pDifferentRow p
77c0: 61 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73  arameter is fals
77d0: 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  e if the cursor 
77e0: 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74  is left.** point
77f0: 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74  ing at exactly t
7800: 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70  he same row.  *p
7810: 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74  DifferntRow is t
7820: 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f  he row the curso
7830: 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e  r.** was pointin
7840: 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65  g to has been de
7850: 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74  leted, forcing t
7860: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
7870: 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65  nt to some.** ne
7880: 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20  arby row..**.** 
7890: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
78a0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
78b0: 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  ed for a cursor 
78c0: 74 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e  that just return
78d0: 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20  ed.** TRUE from 
78e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
78f0: 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f  orHasMoved()..*/
7900: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
7910: 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42  eCursorRestore(B
7920: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
7930: 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  nt *pDifferentRo
7940: 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  w){.  int rc;.. 
7950: 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
7960: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
7970: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
7980: 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63  OR_VALID );.  rc
7990: 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
79a0: 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
79b0: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
79c0: 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d  *pDifferentRow =
79d0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   1;.    return r
79e0: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  c;.  }.  if( pCu
79f0: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7a00: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  R_VALID ){.    *
7a10: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7a20: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
7a30: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
7a40: 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20 20 20  ipNext==0 );.   
7a50: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7a60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
7a70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
7a80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
7a90: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
7aa0: 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  S./*.** Provide 
7ab0: 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72  hints to the cur
7ac0: 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74 69 63  sor.  The partic
7ad0: 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20  ular hint given 
7ae0: 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a  (and the type.**
7af0: 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74   and number of t
7b00: 68 65 20 76 61 72 61 72 67 73 20 70 61 72 61 6d  he varargs param
7b10: 65 74 65 72 73 29 20 69 73 20 64 65 74 65 72 6d  eters) is determ
7b20: 69 6e 65 64 20 62 79 20 74 68 65 20 65 48 69 6e  ined by the eHin
7b30: 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74  tType.** paramet
7b40: 65 72 2e 20 20 53 65 65 20 74 68 65 20 64 65 66  er.  See the def
7b50: 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  initions of the 
7b60: 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63  BTREE_HINT_* mac
7b70: 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ros for details.
7b80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7b90: 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28  BtreeCursorHint(
7ba0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7bb0: 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e  int eHintType, .
7bc0: 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f  ..){.  /* Used o
7bd0: 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20 74 68  nly by system th
7be0: 61 74 20 73 75 62 73 74 69 74 75 74 65 20 74 68  at substitute th
7bf0: 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20  eir own storage 
7c00: 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64  engine */.}.#end
7c10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  if../*.** Provid
7c20: 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20  e flag hints to 
7c30: 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76  the cursor..*/.v
7c40: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
7c50: 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28  CursorHintFlags(
7c60: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
7c70: 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61  unsigned x){.  a
7c80: 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f  ssert( x==BTREE_
7c90: 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54  SEEK_EQ || x==BT
7ca0: 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20  REE_BULKLOAD || 
7cb0: 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e  x==0 );.  pCur->
7cc0: 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23  hints = x;.}...#
7cd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7ce0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
7cf0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
7d00: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
7d10: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
7d20: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
7d30: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
7d40: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
7d50: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
7d60: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
7d70: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
7d80: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  page number..**.
7d90: 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74  ** Return 0 (not
7da0: 20 61 20 76 61 6c 69 64 20 70 61 67 65 29 20 66   a valid page) f
7db0: 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65  or pgno==1 since
7dc0: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
7dd0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f  pointer map asso
7de0: 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
7df0: 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69   1.  The integri
7e00: 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a  ty_check logic.*
7e10: 2a 20 72 65 71 75 69 72 65 73 20 74 68 61 74 20  * requires that 
7e20: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31  ptrmapPageno(*,1
7e30: 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  )!=1..*/.static 
7e40: 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e  Pgno ptrmapPagen
7e50: 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  o(BtShared *pBt,
7e60: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
7e70: 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  nt nPagesPerMapP
7e80: 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  age;.  Pgno iPtr
7e90: 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65  Map, ret;.  asse
7ea0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
7eb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
7ec0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
7ed0: 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  <2 ) return 0;. 
7ee0: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
7ef0: 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  e = (pBt->usable
7f00: 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74  Size/5)+1;.  iPt
7f10: 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f  rMap = (pgno-2)/
7f20: 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65  nPagesPerMapPage
7f30: 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d  ;.  ret = (iPtrM
7f40: 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50  ap*nPagesPerMapP
7f50: 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28  age) + 2; .  if(
7f60: 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59   ret==PENDING_BY
7f70: 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
7f80: 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20      ret++;.  }. 
7f90: 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
7fa0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65  /*.** Write an e
7fb0: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
7fc0: 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a  inter map..**.**
7fd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70   This routine up
7fe0: 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65  dates the pointe
7ff0: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8000: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79  page number 'key
8010: 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20  '.** so that it 
8020: 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65 54  maps to type 'eT
8030: 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20  ype' and parent 
8040: 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e  page number 'pgn
8050: 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52  o'..**.** If *pR
8060: 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e  C is initially n
8070: 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c  on-zero (non-SQL
8080: 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69  ITE_OK) then thi
8090: 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20  s routine is.** 
80a0: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20  a no-op.  If an 
80b0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
80c0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
80d0: 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72 69 74  ror code is writ
80e0: 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43  ten.** into *pRC
80f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8100: 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61   ptrmapPut(BtSha
8110: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
8120: 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67  ey, u8 eType, Pg
8130: 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a  no parent, int *
8140: 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  pRC){.  DbPage *
8150: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
8160: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8170: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
8180: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
81a0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
81b0: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
81c0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
81d0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
81e0: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
81f0: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
8200: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
8210: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
8220: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
8230: 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
8240: 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70  ons */..  if( *p
8250: 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  RC ) return;..  
8260: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8270: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
8280: 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54  mutex) );.  /* T
8290: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
82a0: 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75  l page number mu
82b0: 73 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  st never be used
82c0: 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61   as a pointer ma
82d0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65  p page */.  asse
82e0: 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53  rt( 0==PTRMAP_IS
82f0: 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e  PAGE(pBt, PENDIN
8300: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
8310: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
8320: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
8330: 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20  );.  if( key==0 
8340: 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
8350: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8360: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
8370: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
8380: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
8390: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
83a0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
83b0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
83c0: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30  map, &pDbPage, 0
83d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
83e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
83f0: 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74  RC = rc;.    ret
8400: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65  urn;.  }.  offse
8410: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8420: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8430: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8440: 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  <0 ){.    *pRC =
8450: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8460: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
8470: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
8480: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
8490: 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73   <= (int)pBt->us
84a0: 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20  ableSize-5 );.  
84b0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
84c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
84d0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
84e0: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
84f0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
8500: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8510: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
8520: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
8530: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
8540: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
8550: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
8560: 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43  rent));.    *pRC
8570: 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  = rc = sqlite3Pa
8580: 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
8590: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
85a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
85b0: 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74    pPtrmap[offset
85c0: 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20  ] = eType;.     
85d0: 20 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d   put4byte(&pPtrm
85e0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61  ap[offset+1], pa
85f0: 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
8600: 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20  ..ptrmap_exit:. 
8610: 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
8620: 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a  ef(pDbPage);.}..
8630: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e  /*.** Read an en
8640: 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69  try from the poi
8650: 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20  nter map..**.** 
8660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
8670: 72 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74  rieves the point
8680: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
8690: 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69   page 'key', wri
86a0: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65  ting.** the type
86b0: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
86c0: 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79   number to *pETy
86d0: 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65  pe and *pPgno re
86e0: 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41  spectively..** A
86f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
8700: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
8710: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
8720: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
8730: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
8740: 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42   int ptrmapGet(B
8750: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
8760: 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79  no key, u8 *pETy
8770: 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29  pe, Pgno *pPgno)
8780: 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  {.  DbPage *pDbP
8790: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f  age;   /* The po
87a0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
87b0: 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b  /.  int iPtrmap;
87c0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
87d0: 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78  r map page index
87e0: 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61   */.  u8 *pPtrma
87f0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8800: 74 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74  ter map page dat
8810: 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  a */.  int offse
8820: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  t;        /* Off
8830: 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20  set of entry in 
8840: 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20  pointer map */. 
8850: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
8860: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8870: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
8880: 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70  x) );..  iPtrmap
8890: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
88a0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
88b0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
88c0: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
88d0: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
88e0: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  e, 0);.  if( rc!
88f0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8900: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d   rc;.  }.  pPtrm
8910: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
8920: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
8930: 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73  DbPage);..  offs
8940: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
8950: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
8960: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
8970: 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  t<0 ){.    sqlit
8980: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
8990: 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
89a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
89b0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
89c0: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
89d0: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
89e0: 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72  ize-5 );.  asser
89f0: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
8a00: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
8a10: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
8a20: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
8a30: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
8a40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
8a50: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
8a60: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
8a70: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
8a80: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
8a90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8aa0: 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d  RRUPT_PGNO(iPtrm
8ab0: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ap);.  return SQ
8ac0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73  LITE_OK;.}..#els
8ad0: 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20  e /* if defined 
8ae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
8af0: 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66  VACUUM */.  #def
8b00: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c  ine ptrmapPut(w,
8b10: 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66  x,y,z,rc).  #def
8b20: 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c  ine ptrmapGet(w,
8b30: 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b  x,y,z) SQLITE_OK
8b40: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8b50: 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79  pPutOvflPtr(x, y
8b60: 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  , rc).#endif../*
8b70: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
8b80: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
8b90: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
8ba0: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
8bb0: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
8bc0: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
8bd0: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
8be0: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
8bf0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
8c00: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
8c10: 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61  **.** findCellPa
8c20: 73 74 50 74 72 28 29 20 64 6f 65 73 20 74 68 65  stPtr() does the
8c30: 20 73 61 6d 65 20 65 78 63 65 70 74 20 69 74 20   same except it 
8c40: 73 6b 69 70 73 20 70 61 73 74 20 74 68 65 20 69  skips past the i
8c50: 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65  nitial.** 4-byte
8c60: 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66   child pointer f
8c70: 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72  ound on interior
8c80: 20 70 61 67 65 73 2c 20 69 66 20 74 68 65 72 65   pages, if there
8c90: 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54   is one..**.** T
8ca0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
8cb0: 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73  s only for pages
8cc0: 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e   that do not con
8cd0: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
8ce0: 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lls..*/.#define 
8cf0: 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a  findCell(P,I) \.
8d00: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20    ((P)->aData + 
8d10: 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26  ((P)->maskPage &
8d20: 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
8d30: 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b  (&(P)->aCellIdx[
8d40: 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e  2*(I)]))).#defin
8d50: 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  e findCellPastPt
8d60: 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  r(P,I) \.  ((P)-
8d70: 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50  >aDataOfst + ((P
8d80: 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65  )->maskPage & ge
8d90: 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28  t2byteAligned(&(
8da0: 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28  P)->aCellIdx[2*(
8db0: 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54  I)]))).../*.** T
8dc0: 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61  his is common ta
8dd0: 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  il processing fo
8de0: 72 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  r btreeParseCell
8df0: 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72  Ptr() and.** btr
8e00: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
8e10: 64 65 78 28 29 20 66 6f 72 20 74 68 65 20 63 61  dex() for the ca
8e20: 73 65 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c  se when the cell
8e30: 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e   does not fit en
8e40: 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73  tirely.** on a s
8e50: 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67  ingle B-tree pag
8e60: 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61  e.  Make necessa
8e70: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74  ry adjustments t
8e80: 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a  o the CellInfo.*
8e90: 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  * structure..*/.
8ea0: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
8eb0: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65  INLINE void btre
8ec0: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
8ed0: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
8ee0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
8ef0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8f00: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
8f10: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
8f20: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
8f30: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
8f40: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
8f50: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
8f60: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
8f70: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
8f80: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
8f90: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
8fa0: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
8fb0: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
8fc0: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
8fd0: 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63  have.  ** to dec
8fe0: 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  ide how much to 
8ff0: 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e  store locally an
9000: 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70  d how much to sp
9010: 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76  ill onto.  ** ov
9020: 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54  erflow pages.  T
9030: 68 65 20 73 74 72 61 74 65 67 79 20 69 73 20 74  he strategy is t
9040: 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61  o minimize the a
9050: 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a  mount of unused.
9060: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
9070: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
9080: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
9090: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
90a0: 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62  torage.  ** in b
90b0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
90c0: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
90d0: 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  **.  ** Warning:
90e0: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
90f0: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
9100: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
9110: 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77  ed in any.  ** w
9120: 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69  ay will result i
9130: 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  n an incompatibl
9140: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20  e file format.. 
9150: 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63   */.  int minLoc
9160: 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  al;  /* Minimum 
9170: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
9180: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9190: 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c  /.  int maxLocal
91a0: 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d  ;  /* Maximum am
91b0: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
91c0: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
91d0: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
91e0: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
91f0: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
9200: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
9210: 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20   */..  minLocal 
9220: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
9230: 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20  l;.  maxLocal = 
9240: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b  pPage->maxLocal;
9250: 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e  .  surplus = min
9260: 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e  Local + (pInfo->
9270: 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f  nPayload - minLo
9280: 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74  cal)%(pPage->pBt
9290: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b  ->usableSize-4);
92a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72  .  testcase( sur
92b0: 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29  plus==maxLocal )
92c0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 75  ;.  testcase( su
92d0: 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b  rplus==maxLocal+
92e0: 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c  1 );.  if( surpl
92f0: 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29  us <= maxLocal )
9300: 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  {.    pInfo->nLo
9310: 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c  cal = (u16)surpl
9320: 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  us;.  }else{.   
9330: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9340: 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a   (u16)minLocal;.
9350: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69    }.  pInfo->nSi
9360: 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66  ze = (u16)(&pInf
9370: 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66  o->pPayload[pInf
9380: 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65  o->nLocal] - pCe
9390: 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll) + 4;.}../*.*
93a0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
93b0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70  routines are imp
93c0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20  lementations of 
93d0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72  the MemPage.xPar
93e0: 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68  seCell().** meth
93f0: 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20  od..**.** Parse 
9400: 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62  a cell content b
9410: 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e  lock and fill in
9420: 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74   the CellInfo st
9430: 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62  ructure..**.** b
9440: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9450: 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74  ()        =>   t
9460: 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20  able btree leaf 
9470: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
9480: 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64  rseCellNoPayload
9490: 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62  ()  =>   table b
94a0: 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  tree internal no
94b0: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
94c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
94d0: 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72    =>   index btr
94e0: 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54  ee nodes.**.** T
94f0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77  here is also a w
9500: 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20  rapper function 
9510: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
9520: 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a   that works for.
9530: 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74  ** all MemPage t
9540: 79 70 65 73 20 61 6e 64 20 74 68 61 74 20 72 65  ypes and that re
9550: 66 65 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c  ferences the cel
9560: 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74 68 65  l by index rathe
9570: 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69  r than.** by poi
9580: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
9590: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
95a0: 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  ellPtrNoPayload(
95b0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
95c0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
95d0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
95e0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
95f0: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
9600: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
9610: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
9620: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
9630: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
9640: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
9650: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
9660: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
9670: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9680: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9690: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
96a0: 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61  ->leaf==0 );.  a
96b0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
96c0: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
96d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
96e0: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
96f0: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
9700: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d  .#endif.  pInfo-
9710: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
9720: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
9730: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
9740: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
9750: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
9760: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9770: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79  0;.  pInfo->pPay
9780: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  load = 0;.  retu
9790: 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rn;.}.static voi
97a0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
97b0: 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Ptr(.  MemPage *
97c0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
97d0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
97e0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
97f0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9800: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9810: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9820: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9830: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9840: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9850: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9860: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9880: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9890: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
98a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
98b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
98c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
98d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75  l payload */.  u
98e0: 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20  64 iKey;        
98f0: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
9900: 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f  ted Key value */
9910: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
9920: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
9930: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
9940: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
9950: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
9960: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
9970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9980: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29  ge->intKeyLeaf )
9990: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
99a0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
99b0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
99c0: 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65  pCell;..  /* The
99d0: 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63   next block of c
99e0: 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ode is equivalen
99f0: 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  t to:.  **.  ** 
9a00: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
9a10: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
9a20: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a  nPayload);.  **.
9a30: 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73    ** The code is
9a40: 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69   inlined to avoi
9a50: 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  d a function cal
9a60: 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f  l..  */.  nPaylo
9a70: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9a80: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9a90: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9aa0: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9ab0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9ac0: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9ad0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9ae0: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9af0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b00: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70  .    }while( (*p
9b10: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b20: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b30: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f  .  pIter++;..  /
9b40: 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b  * The next block
9b50: 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71 75 69   of code is equi
9b60: 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a  valent to:.  **.
9b70: 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b    **     pIter +
9b80: 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49 74 65  = getVarint(pIte
9b90: 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  r, (u64*)&pInfo-
9ba0: 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a  >nKey);.  **.  *
9bb0: 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e  * The code is in
9bc0: 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61  lined to avoid a
9bd0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a   function call..
9be0: 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70    */.  iKey = *p
9bf0: 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79  Iter;.  if( iKey
9c00: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9c10: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9c20: 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20  7];.    iKey &= 
9c30: 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28  0x7f;.    while(
9c40: 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d  1){.      iKey =
9c50: 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b   (iKey<<7) | (*+
9c60: 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a  +pIter & 0x7f);.
9c70: 20 20 20 20 20 20 69 66 28 20 28 2a 70 49 74 65        if( (*pIte
9c80: 72 29 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b  r)<0x80 ) break;
9c90: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
9ca0: 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  >=pEnd ){.      
9cb0: 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c    iKey = (iKey<<
9cc0: 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20  8) | *++pIter;. 
9cd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9ce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9cf0: 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49    pIter++;..  pI
9d00: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36  nfo->nKey = *(i6
9d10: 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66  4*)&iKey;.  pInf
9d20: 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50  o->nPayload = nP
9d30: 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d  ayload;.  pInfo-
9d40: 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65  >pPayload = pIte
9d50: 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  r;.  testcase( n
9d60: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9d70: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9d80: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
9d90: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
9da0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61  l+1 );.  if( nPa
9db0: 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
9dc0: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a  xLocal ){.    /*
9dd0: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
9de0: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
9df0: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
9e00: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
9e10: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
9e20: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
9e30: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
9e40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
9e50: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79  fo->nSize = nPay
9e60: 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49 74  load + (u16)(pIt
9e70: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20  er - pCell);.   
9e80: 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a   if( pInfo->nSiz
9e90: 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69  e<4 ) pInfo->nSi
9ea0: 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66  ze = 4;.    pInf
9eb0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
9ec0: 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c  )nPayload;.  }el
9ed0: 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72  se{.    btreePar
9ee0: 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65  seCellAdjustSize
9ef0: 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67  ForOverflow(pPag
9f00: 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29  e, pCell, pInfo)
9f10: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
9f20: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9f30: 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65  llPtrIndex(.  Me
9f40: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9f50: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9f60: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9f70: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
9f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9f90: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
9fa0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9fb0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9fd0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9fe0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
9ff0: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
a000: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
a010: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
a020: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
a030: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
a040: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
a050: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
a060: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
a070: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a080: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
a090: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
a0a0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
a0b0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
a0c0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
a0d0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
a0e0: 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  f==0 );.  pIter 
a0f0: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
a100: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
a110: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
a120: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
a130: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
a140: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
a150: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
a160: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
a170: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
a180: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
a190: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a1a0: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a1b0: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a1c0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a1d0: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a1e0: 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  +;.  pInfo->nKey
a1f0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a200: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
a210: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
a220: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70  fo->pPayload = p
a230: 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Iter;.  testcase
a240: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a250: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
a260: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
a270: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
a280: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20  ocal+1 );.  if( 
a290: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
a2a0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a2b0: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
a2c0: 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61  (easy) common ca
a2d0: 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74  se where the ent
a2e0: 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73  ire payload fits
a2f0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  .    ** on the l
a300: 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f  ocal page.  No o
a310: 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69  verflow is requi
a320: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
a330: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
a340: 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28  Payload + (u16)(
a350: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a360: 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e      if( pInfo->n
a370: 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e  Size<4 ) pInfo->
a380: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70  nSize = 4;.    p
a390: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
a3a0: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
a3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65  }else{.    btree
a3c0: 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53  ParseCellAdjustS
a3d0: 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70  izeForOverflow(p
a3e0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
a3f0: 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  fo);.  }.}.stati
a400: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
a410: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
a420: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
a430: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
a440: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
a450: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
a460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a470: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
a480: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
a490: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a4a0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a4b0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a4c0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61  ture */.){.  pPa
a4d0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a4e0: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
a4f0: 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49  Page, iCell), pI
a500: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  nfo);.}../*.** T
a510: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
a520: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
a530: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
a540: 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69   MemPage.xCellSi
a550: 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ze.** method..**
a560: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  .** Compute the 
a570: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
a580: 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65 6c  bytes that a Cel
a590: 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63  l needs in the c
a5a0: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61  ell.** data area
a5b0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70 61   of the btree-pa
a5c0: 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ge.  The return 
a5d0: 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20  number includes 
a5e0: 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61  the cell.** data
a5f0: 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65 20   header and the 
a600: 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62  local payload, b
a610: 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66  ut not any overf
a620: 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  low page or.** t
a630: 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79  he space used by
a640: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
a650: 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a  r..**.** cellSiz
a660: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20  ePtrNoPayload() 
a670: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e     =>   table in
a680: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
a690: 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20  cellSizePtr()   
a6a0: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61            =>   a
a6b0: 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26  ll index nodes &
a6c0: 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65   table leaf node
a6d0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20  s.*/.static u16 
a6e0: 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50  cellSizePtr(MemP
a6f0: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
a700: 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49  pCell){.  u8 *pI
a710: 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50  ter = pCell + pP
a720: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
a730: 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  e; /* For loopin
a740: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a750: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a760: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20      /* End mark 
a790: 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a  for a varint */.
a7a0: 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20    u32 nSize;    
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a7d0: 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  ze value to retu
a7e0: 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  rn */..#ifdef SQ
a7f0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
a800: 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
a810: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
a820: 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79  ion should alway
a830: 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  s be the same as
a840: 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49  .  ** the (CellI
a850: 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65  nfo.nSize) value
a860: 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20   found by doing 
a870: 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20  a full parse of 
a880: 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49  the.  ** cell. I
a890: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  f SQLITE_DEBUG i
a8a0: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  s defined, an as
a8b0: 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62 6f  sert() at the bo
a8c0: 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69  ttom of.  ** thi
a8d0: 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66  s function verif
a8e0: 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69 6e  ies that this in
a8f0: 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76  variant is not v
a900: 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65  iolated. */.  Ce
a910: 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f  llInfo debuginfo
a920: 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  ;.  pPage->xPars
a930: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
a940: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
a950: 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65  .#endif..  nSize
a960: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
a970: 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a   nSize>=0x80 ){.
a980: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
a990: 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20  r[8];.    nSize 
a9a0: 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b  &= 0x7f;.    do{
a9b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28  .      nSize = (
a9c0: 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b  nSize<<7) | (*++
a9d0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
a9e0: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
a9f0: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
aa00: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
aa10: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20   pIter++;.  if( 
aa20: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
aa30: 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f  .    /* pIter no
aa40: 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  w points at the 
aa50: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b  64-bit integer k
aa60: 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69  ey value, a vari
aa70: 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20  able length .   
aa80: 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65   ** integer. The
aa90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
aaa0: 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20   moves pIter to 
aab0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72  point at the fir
aac0: 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70  st byte.    ** p
aad0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
aae0: 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f  he key value. */
aaf0: 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74  .    pEnd = &pIt
ab00: 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  er[9];.    while
ab10: 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38  ( (*pIter++)&0x8
ab20: 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20  0 && pIter<pEnd 
ab30: 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
ab40: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ab50: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
ab60: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
ab70: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
ab80: 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  1 );.  if( nSize
ab90: 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
aba0: 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b  l ){.    nSize +
abb0: 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d 20  = (u32)(pIter - 
abc0: 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20  pCell);.    if( 
abd0: 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20  nSize<4 ) nSize 
abe0: 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 4;.  }else{.  
abf0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d    int minLocal =
ac00: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
ac10: 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69  ;.    nSize = mi
ac20: 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20  nLocal + (nSize 
ac30: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70  - minLocal) % (p
ac40: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
ac50: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
ac60: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
ac70: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
ac80: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
ac90: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
aca0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
acb0: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
acc0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
acd0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
ace0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
acf0: 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75   nSize += 4 + (u
ad00: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
ad10: 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  l);.  }.  assert
ad20: 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e  ( nSize==debugin
ad30: 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52  fo.nSize || CORR
ad40: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
ad50: 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d  rn (u16)nSize;.}
ad60: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
ad70: 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64  SizePtrNoPayload
ad80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
ad90: 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75   u8 *pCell){.  u
ada0: 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  8 *pIter = pCell
adb0: 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f   + 4; /* For loo
adc0: 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20  ping over bytes 
add0: 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  of pCell */.  u8
ade0: 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20   *pEnd;         
adf0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
ae00: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
ae10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
ae20: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76  DEBUG.  /* The v
ae30: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
ae40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
ae50: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
ae60: 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a  the same as.  **
ae70: 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e   the (CellInfo.n
ae80: 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e  Size) value foun
ae90: 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c  d by doing a ful
aea0: 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20  l parse of the. 
aeb0: 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c   ** cell. If SQL
aec0: 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
aed0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
aee0: 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20  ) at the bottom 
aef0: 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  of.  ** this fun
af00: 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74  ction verifies t
af10: 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61  hat this invaria
af20: 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74  nt is not violat
af30: 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  ed. */.  CellInf
af40: 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70  o debuginfo;.  p
af50: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
af60: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
af70: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73  debuginfo);.#els
af80: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
af90: 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e  ETER(pPage);.#en
afa0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
afb0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
afc0: 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20  ze==4 );.  pEnd 
afd0: 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77  = pIter + 9;.  w
afe0: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
aff0: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
b000: 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28  End );.  assert(
b010: 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65   debuginfo.nSize
b020: 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20 2d 20  ==(u16)(pIter - 
b030: 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50  pCell) || CORRUP
b040: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
b050: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
b060: 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65  Cell);.}...#ifde
b070: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
b080: 2a 20 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e  * This variation
b090: 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28   on cellSizePtr(
b0a0: 29 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  ) is used inside
b0b0: 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 61   of assert() sta
b0c0: 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e  tements.** only.
b0d0: 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63   */.static u16 c
b0e0: 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20  ellSize(MemPage 
b0f0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
b100: 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  l){.  return pPa
b110: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b120: 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50  age, findCell(pP
b130: 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a  age, iCell));.}.
b140: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
b150: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
b160: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
b170: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
b180: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
b190: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
b1a0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
b1b0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
b1c0: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
b1d0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
b1e0: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
b1f0: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
b200: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
b210: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
b220: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
b230: 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43  *pCell, int *pRC
b240: 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  ){.  CellInfo in
b250: 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29  fo;.  if( *pRC )
b260: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
b270: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
b280: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b290: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b2a0: 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
b2b0: 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
b2c0: 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  nPayload ){.    
b2d0: 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34  Pgno ovfl = get4
b2e0: 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
b2f0: 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20  .nSize-4]);.    
b300: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
b310: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
b320: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
b330: 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b  age->pgno, pRC);
b340: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
b350: 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74  /*.** Defragment
b360: 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e   the page given.
b370: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
b380: 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c 73 20  organizes cells 
b390: 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 70 61  within the.** pa
b3a0: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b3b0: 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62 6c 6f   are no free-blo
b3c0: 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  cks on the free-
b3d0: 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  block list..**.*
b3e0: 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d 61 78  * Parameter nMax
b3f0: 46 72 61 67 20 69 73 20 74 68 65 20 6d 61 78 69  Frag is the maxi
b400: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72  mum amount of fr
b410: 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20 74  agmented space t
b420: 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 70 72  hat may be.** pr
b430: 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70 61 67  esent in the pag
b440: 65 20 61 66 74 65 72 20 74 68 69 73 20 72 6f 75  e after this rou
b450: 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a 2a 2a  tine returns..**
b460: 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a  .** EVIDENCE-OF:
b470: 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53   R-44582-60138 S
b480: 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74  QLite may from t
b490: 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72  ime to time reor
b4a0: 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72  ganize a.** b-tr
b4b0: 65 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  ee page so that 
b4c0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65  there are no fre
b4d0: 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d  eblocks or fragm
b4e0: 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a  ent bytes, all.*
b4f0: 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61  * unused bytes a
b500: 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20  re contained in 
b510: 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20  the unallocated 
b520: 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e  space region, an
b530: 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61  d all.** cells a
b540: 72 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c  re packed tightl
b550: 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  y at the end of 
b560: 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
b570: 74 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65  tic int defragme
b580: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
b590: 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61 78 46  pPage, int nMaxF
b5a0: 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  rag){.  int i;  
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
b5d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
b600: 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a   the i-th cell *
b610: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b630: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
b640: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
b650: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
b660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b670: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
b680: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
b690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
b6a0: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
b6b0: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
b6c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
b6d0: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
b6e0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b6f0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
b700: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
b710: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
b720: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
b730: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
b740: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
b750: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
b760: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b770: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
b780: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
b790: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
b7a0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
b7b0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
b7c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
b7d0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
b7e0: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
b7f0: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69  ontent */.  unsi
b800: 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b 20  gned char *src; 
b810: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
b820: 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20   of content */. 
b830: 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b   int iCellFirst;
b840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b850: 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63  irst allowable c
b860: 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  ell index */.  i
b870: 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20  nt iCellLast;   
b880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73            /* Las
b890: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
b8a0: 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73 73 65  index */..  asse
b8b0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b8c0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b8d0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b8e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b8f0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
b900: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
b910: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
b920: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
b930: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
b940: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b950: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b960: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b970: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
b980: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
b990: 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61   = 0;.  src = da
b9a0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
b9b0: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
b9c0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
b9d0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
b9e0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
b9f0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
ba00: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
ba10: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
ba20: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
ba30: 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  ;.  iCellFirst =
ba40: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
ba50: 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53  nCell;.  usableS
ba60: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ize = pPage->pBt
ba70: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20  ->usableSize;.. 
ba80: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 68   /* This block h
ba90: 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77 69 74  andles pages wit
baa0: 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72 20 66  h two or fewer f
bab0: 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64 20 6e  ree blocks and n
bac0: 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f 72 20  MaxFrag.  ** or 
bad0: 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74 65 64  fewer fragmented
bae0: 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69 73 20   bytes. In this 
baf0: 63 61 73 65 20 69 74 20 69 73 20 66 61 73 74 65  case it is faste
bb00: 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a 20 20  r to move the.  
bb10: 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65 29 20  ** two (or one) 
bb20: 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c 73 20  blocks of cells 
bb30: 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28 29 20  using memmove() 
bb40: 61 6e 64 20 61 64 64 20 74 68 65 20 72 65 71 75  and add the requ
bb50: 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73 65 74  ired.  ** offset
bb60: 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e 74 65  s to each pointe
bb70: 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f  r in the cell-po
bb80: 69 6e 74 65 72 20 61 72 72 61 79 20 74 68 61 6e  inter array than
bb90: 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a 2a 20   it is to .  ** 
bba0: 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20  reconstruct the 
bbb0: 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20 2a 2f  entire page.  */
bbc0: 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61 74 61  .  if( (int)data
bbd0: 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46 72 61  [hdr+7]<=nMaxFra
bbe0: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 46 72  g ){.    int iFr
bbf0: 65 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ee = get2byte(&d
bc00: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
bc10: 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20   if( iFree ){.  
bc20: 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d      int iFree2 =
bc30: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
bc40: 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20 20 20  iFree]);..      
bc50: 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28  /* pageFindSlot(
bc60: 29 20 68 61 73 20 61 6c 72 65 61 64 79 20 76 65  ) has already ve
bc70: 72 69 66 69 65 64 20 74 68 61 74 20 66 72 65 65  rified that free
bc80: 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f 72 74   blocks are sort
bc90: 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 6f  ed.      ** in o
bca0: 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74 20 77  rder of offset w
bcb0: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2c 20  ithin the page, 
bcc0: 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c 6f 63  and that no bloc
bcd0: 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20 20 20  k extends.      
bce0: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
bcf0: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50 72 6f  of the page. Pro
bd00: 76 69 64 65 64 20 74 68 65 20 74 77 6f 20 66 72  vided the two fr
bd10: 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f 74 20  ee slots do not 
bd20: 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 6c 61  .      ** overla
bd30: 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e 74 65  p, this guarante
bd40: 65 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6d  es that the memm
bd50: 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65 6c 6f  ove() calls belo
bd60: 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20 20 20  w will not.     
bd70: 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20 74 68   ** overwrite th
bd80: 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62 79 74  e usableSize byt
bd90: 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e 20 69  e buffer, even i
bda0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  f the database p
bdb0: 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
bdc0: 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 20  corrupt.  */.   
bdd0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
bde0: 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32 3e 69  2==0 || iFree2>i
bdf0: 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Free );.      as
be00: 73 65 72 74 28 20 69 46 72 65 65 2b 67 65 74 32  sert( iFree+get2
be10: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
be20: 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  +2]) <= usableSi
be30: 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ze );.      asse
be40: 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20 7c 7c  rt( iFree2==0 ||
be50: 20 69 46 72 65 65 32 2b 67 65 74 32 62 79 74 65   iFree2+get2byte
be60: 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b 32 5d  (&data[iFree2+2]
be70: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
be80: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
be90: 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61  =iFree2 || (data
bea0: 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64  [iFree2]==0 && d
beb0: 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30  ata[iFree2+1]==0
bec0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ) ){.        u8 
bed0: 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65  *pEnd = &data[ce
bee0: 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
bef0: 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  *2];.        u8 
bf00: 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20  *pAddr;.        
bf10: 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20  int sz2 = 0;.   
bf20: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65       int sz = ge
bf30: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
bf40: 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  ee+2]);.        
bf50: 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79  int top = get2by
bf60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
bf70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
bf80: 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20  p>=iFree ){.    
bf90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bfa0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
bfb0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
bfc0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
bfd0: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
bfe0: 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
bff0: 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29 3b 20 2f  +sz<=iFree2 ); /
c000: 2a 20 56 65 72 69 66 69 65 64 20 62 79 20 70 61  * Verified by pa
c010: 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 2a 2f 0a  geFindSlot() */.
c020: 20 20 20 20 20 20 20 20 20 20 73 7a 32 20 3d 20            sz2 = 
c030: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
c040: 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20  Free2+2]);.     
c050: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
c060: 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65 65 32  ee+sz+sz2+iFree2
c070: 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d 20 75  -(iFree+sz) <= u
c080: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20  sableSize );.   
c090: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
c0a0: 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a  data[iFree+sz+sz
c0b0: 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65 65 2b  2], &data[iFree+
c0c0: 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69 46 72  sz], iFree2-(iFr
c0d0: 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20 20 20  ee+sz));.       
c0e0: 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20     sz += sz2;.  
c0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c100: 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20  cbrk = top+sz;. 
c110: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
c120: 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70 29 20  brk+(iFree-top) 
c130: 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  <= usableSize );
c140: 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
c150: 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64  (&data[cbrk], &d
c160: 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d  ata[top], iFree-
c170: 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  top);.        fo
c180: 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b 63 65  r(pAddr=&data[ce
c190: 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64 64 72  llOffset]; pAddr
c1a0: 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29  <pEnd; pAddr+=2)
c1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d  {.          pc =
c1c0: 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29   get2byte(pAddr)
c1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
c1e0: 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75 74 32  pc<iFree ){ put2
c1f0: 62 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73  byte(pAddr, pc+s
c200: 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  z); }.          
c210: 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46 72 65  else if( pc<iFre
c220: 65 32 20 29 7b 20 70 75 74 32 62 79 74 65 28 70  e2 ){ put2byte(p
c230: 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d  Addr, pc+sz2); }
c240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c250: 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67 6d 65     goto defragme
c260: 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  nt_out;.      }.
c270: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72      }.  }..  cbr
c280: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
c290: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
c2a0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
c2b0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
c2c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
c2d0: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
c2e0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
c2f0: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
c300: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
c310: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
c320: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
c330: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
c340: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
c350: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
c360: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
c370: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
c380: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
c390: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
c3a0: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
c3b0: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
c3c0: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
c3d0: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
c3e0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c3f0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
c400: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
c410: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c420: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
c430: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
c440: 20 20 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69     assert( pc>=i
c450: 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c  CellFirst && pc<
c460: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
c470: 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e    size = pPage->
c480: 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
c490: 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20   &src[pc]);.    
c4a0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20  cbrk -= size;.  
c4b0: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
c4c0: 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65  First || pc+size
c4d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
c4e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c4f0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
c500: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
c510: 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b 73    assert( cbrk+s
c520: 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize<=usableSize 
c530: 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69  && cbrk>=iCellFi
c540: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
c550: 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d  ase( cbrk+size==
c560: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c570: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
c580: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c590: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
c5a0: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
c5b0: 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b    if( temp==0 ){
c5c0: 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a 20 20  .      int x;.  
c5d0: 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d 70 63      if( cbrk==pc
c5e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c5f0: 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65     temp = sqlite
c600: 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
c610: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67  pPage->pBt->pPag
c620: 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  er);.      x = g
c630: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
c640: 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d  r+5]);.      mem
c650: 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64  cpy(&temp[x], &d
c660: 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69  ata[x], (cbrk+si
c670: 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20 20 20  ze) - x);.      
c680: 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20  src = temp;.    
c690: 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  }.    memcpy(&da
c6a0: 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70  ta[cbrk], &src[p
c6b0: 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  c], size);.  }. 
c6c0: 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
c6d0: 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f  ;.. defragment_o
c6e0: 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61 5b 68  ut:.  if( data[h
c6f0: 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c  dr+7]+cbrk-iCell
c700: 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46  First!=pPage->nF
c710: 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ree ){.    retur
c720: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c730: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c740: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
c750: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
c760: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
c770: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
c780: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
c790: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
c7a0: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26   = 0;.  memset(&
c7b0: 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d  data[iCellFirst]
c7c0: 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46  , 0, cbrk-iCellF
c7d0: 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  irst);.  assert(
c7e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
c7f0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
c800: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65  pDbPage) );.  re
c810: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c820: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
c830: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e  the free-list on
c840: 20 70 61 67 65 20 70 50 67 20 66 6f 72 20 73 70   page pPg for sp
c850: 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63  ace to store a c
c860: 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20  ell nByte bytes 
c870: 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f  in.** size. If o
c880: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
c890: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
c8a0: 72 20 74 6f 20 74 68 65 20 73 70 61 63 65 20 61  r to the space a
c8b0: 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20  nd remove it.** 
c8c0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c8d0: 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  st..**.** If no 
c8e0: 73 75 69 74 61 62 6c 65 20 73 70 61 63 65 20 63  suitable space c
c8f0: 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74  an be found on t
c900: 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65  he free-list, re
c910: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  turn NULL..**.**
c920: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
c930: 61 79 20 64 65 74 65 63 74 20 63 6f 72 72 75 70  ay detect corrup
c940: 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e  tion within pPg.
c950: 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20    If corruption 
c960: 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74  is.** detected t
c970: 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20  hen *pRc is set 
c980: 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  to SQLITE_CORRUP
c990: 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65  T and NULL is re
c9a0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c  turned..**.** Sl
c9b0: 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20  ots on the free 
c9c0: 6c 69 73 74 20 74 68 61 74 20 61 72 65 20 62 65  list that are be
c9d0: 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79  tween 1 and 3 by
c9e0: 74 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tes larger than 
c9f0: 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65  nByte.** will be
ca00: 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69   ignored if addi
ca10: 6e 67 20 74 68 65 20 65 78 74 72 61 20 73 70 61  ng the extra spa
ca20: 63 65 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65  ce to the fragme
ca30: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a  ntation count.**
ca40: 20 63 61 75 73 65 73 20 74 68 65 20 66 72 61 67   causes the frag
ca50: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20  mentation count 
ca60: 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f  to exceed 60..*/
ca70: 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61 67 65  .static u8 *page
ca80: 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65  FindSlot(MemPage
ca90: 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65   *pPg, int nByte
caa0: 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63  , int *pRc){.  c
cab0: 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70  onst int hdr = p
cac0: 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  Pg->hdrOffset;. 
cad0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74   u8 * const aDat
cae0: 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a  a = pPg->aData;.
caf0: 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64    int iAddr = hd
cb00: 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20  r + 1;.  int pc 
cb10: 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74  = get2byte(&aDat
cb20: 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74  a[iAddr]);.  int
cb30: 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   x;.  int usable
cb40: 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d  Size = pPg->pBt-
cb50: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
cb60: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
cb70: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
cb80: 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a  he free slot */.
cb90: 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20  .  assert( pc>0 
cba0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63 3c 3d  );.  while( pc<=
cbb0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a  usableSize-4 ){.
cbc0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cbd0: 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32  OF: R-22710-5332
cbe0: 38 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20  8 The third and 
cbf0: 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20  fourth bytes of 
cc00: 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65  each.    ** free
cc10: 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67  block form a big
cc20: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
cc30: 77 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a  which is the siz
cc40: 65 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f  e of the freeblo
cc50: 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74  ck.    ** in byt
cc60: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  es, including th
cc70: 65 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e  e 4-byte header.
cc80: 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67   */.    size = g
cc90: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
cca0: 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28  c+2]);.    if( (
ccb0: 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65  x = size - nByte
ccc0: 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65  )>=0 ){.      te
ccd0: 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a  stcase( x==4 );.
cce0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ccf0: 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66  x==3 );.      if
cd00: 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62  ( size+pc > usab
cd10: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
cd20: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
cd30: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
cd40: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
cd50: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 0;.      }else
cd60: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
cd70: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
cd80: 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32  OF: R-11498-5802
cd90: 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  2 In a well-form
cda0: 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
cdb0: 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20  the total.      
cdc0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62    ** number of b
cdd0: 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74  ytes in fragment
cde0: 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64  s may not exceed
cdf0: 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   60. */.        
ce00: 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  if( aData[hdr+7]
ce10: 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >57 ) return 0;.
ce20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
ce30: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
ce40: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
ce50: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
ce60: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  r of.        ** 
ce70: 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73  fragmented bytes
ce80: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
ce90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d  . */.        mem
cea0: 63 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72  cpy(&aData[iAddr
ceb0: 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32  ], &aData[pc], 2
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61  );.        aData
ced0: 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78  [hdr+7] += (u8)x
cee0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cef0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
cf00: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
cf10: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
cf20: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
cf30: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
cf40: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
cf50: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
cf60: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
cf70: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62  */.        put2b
cf80: 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d  yte(&aData[pc+2]
cf90: 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , x);.      }.  
cfa0: 20 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74      return &aDat
cfb0: 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d  a[pc + x];.    }
cfc0: 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b  .    iAddr = pc;
cfd0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
cfe0: 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a  te(&aData[pc]);.
cff0: 20 20 20 20 69 66 28 20 70 63 3c 69 41 64 64 72      if( pc<iAddr
d000: 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b 0a 20  +size ) break;. 
d010: 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b 0a 20   }.  if( pc ){. 
d020: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
d030: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
d040: 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  g);.  }..  retur
d050: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  n 0;.}../*.** Al
d060: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
d070: 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d  es of space from
d080: 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72   within the B-Tr
d090: 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a  ee page passed.*
d0a0: 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
d0b0: 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69  rgument. Write i
d0c0: 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e  nto *pIdx the in
d0d0: 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  dex into pPage->
d0e0: 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68  aData[].** of th
d0f0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
d100: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e  allocated space.
d110: 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20 53   Return either S
d120: 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61  QLITE_OK or.** a
d130: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73  n error code (us
d140: 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52  ually SQLITE_COR
d150: 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  RUPT)..**.** The
d160: 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65   caller guarante
d170: 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  es that there is
d180: 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
d190: 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a  e to make the.**
d1a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68   allocation.  Th
d1b0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
d1c0: 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d   need to defragm
d1d0: 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ent in order to 
d1e0: 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65  bring.** all the
d1f0: 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c   space together,
d200: 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20   however.  This 
d210: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f  routine will avo
d220: 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20  id using.** the 
d230: 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73 20  first two bytes 
d240: 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f  past the cell po
d250: 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63 65  inter area since
d260: 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73   presumably this
d270: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  .** allocation i
d280: 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20  s being made in 
d290: 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20  order to insert 
d2a0: 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77  a new cell, so w
d2b0: 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65  e will.** also e
d2c0: 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20  nd up needing a 
d2d0: 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
d2e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d2f0: 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65  allocateSpace(Me
d300: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
d310: 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49  t nByte, int *pI
d320: 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  dx){.  const int
d330: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
d340: 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c  rOffset;    /* L
d350: 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50  ocal cache of pP
d360: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a  age->hdrOffset *
d370: 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64  /.  u8 * const d
d380: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
d390: 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61  ta;      /* Loca
d3a0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d3b0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ->aData */.  int
d3c0: 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20   top;           
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
d3f0: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
d400: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63  area */.  int rc
d410: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d430: 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72 6e  * Integer return
d440: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67   code */.  int g
d450: 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ap;        /* Fi
d460: 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70 20  rst byte of gap 
d470: 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69  between cell poi
d480: 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63  nters and cell c
d490: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61  ontent */.  .  a
d4a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
d4b0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
d4c0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
d4d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d4e0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
d4f0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d500: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
d510: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
d520: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
d530: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
d540: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
d550: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d560: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
d580: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
d590: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  );.  assert( nBy
d5a0: 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67 65  te < (int)(pPage
d5b0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d5c0: 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  e-8) );..  asser
d5d0: 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  t( pPage->cellOf
d5e0: 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31 32  fset == hdr + 12
d5f0: 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
d600: 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61 67   );.  gap = pPag
d610: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  e->cellOffset + 
d620: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
d630: 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d 36    assert( gap<=6
d640: 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49  5536 );.  /* EVI
d650: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35  DENCE-OF: R-2935
d660: 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20 64  6-02391 If the d
d670: 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20 36  atabase uses a 6
d680: 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20 73  5536-byte page s
d690: 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ize.  ** and the
d6a0: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20   reserved space 
d6b0: 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73 75  is zero (the usu
d6c0: 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65 73  al value for res
d6d0: 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20 2a  erved space).  *
d6e0: 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 20  * then the cell 
d6f0: 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20 6f  content offset o
d700: 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65 20  f an empty page 
d710: 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35 33  wants to be 6553
d720: 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c  6..  ** However,
d730: 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69 73   that integer is
d740: 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62 65   too large to be
d750: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d 62   stored in a 2-b
d760: 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a  yte unsigned.  *
d770: 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61 20  * integer, so a 
d780: 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75 73  value of 0 is us
d790: 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ed in its place.
d7a0: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
d7b0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
d7c0: 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  ]);.  assert( to
d7d0: 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  p<=(int)pPage->p
d7e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d7f0: 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79 20  ; /* Prevent by 
d800: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 29  getAndInitPage()
d810: 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74 6f   */.  if( gap>to
d820: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f 70  p ){.    if( top
d830: 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70 42  ==0 && pPage->pB
d840: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36  t->usableSize==6
d850: 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74 6f  5536 ){.      to
d860: 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20 7d  p = 65536;.    }
d870: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
d880: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d890: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
d8a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
d8b0: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
d8c0: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
d8d0: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
d8e0: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
d8f0: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
d900: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
d910: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
d920: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
d930: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
d940: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
d950: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
d960: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
d970: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
d980: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
d990: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
d9a0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
d9b0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
d9c0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
d9d0: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
d9e0: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
d9f0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
da00: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
da10: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
da20: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
da30: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
da40: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
da50: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
da60: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
da70: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
da80: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
da90: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
daa0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
dab0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dac0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
dad0: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
dae0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
daf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
db00: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
db10: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
db20: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
db30: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
db40: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
db50: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
db60: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
db70: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
db80: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
db90: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
dba0: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
dbb0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
dbc0: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
dbd0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
dbe0: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
dbf0: 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e  , MIN(4, pPage->
dc00: 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79 74 65  nFree - (2+nByte
dc10: 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
dc20: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
dc30: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
dc40: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
dc50: 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +5]);.    assert
dc60: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74  ( gap+2+nByte<=t
dc70: 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  op );.  }...  /*
dc80: 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
dc90: 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e   from the gap in
dca0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c   between the cel
dcb0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a  l pointer array.
dcc0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c    ** and the cel
dcd0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
dce0: 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50 61   The btreeInitPa
dcf0: 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61 6c  ge() call has al
dd00: 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64  ready.  ** valid
dd10: 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  ated the freelis
dd20: 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20 74  t.  Given that t
dd30: 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20 76  he freelist is v
dd40: 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a  alid, there.  **
dd50: 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74 20   is no way that 
dd60: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63  the allocation c
dd70: 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74 68  an extend off th
dd80: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
dd90: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73 65  e..  ** The asse
dda0: 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69 66  rt() below verif
ddb0: 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  ies the previous
ddc0: 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a   sentence..  */.
ddd0: 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a    top -= nByte;.
dde0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ddf0: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
de00: 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42 79   assert( top+nBy
de10: 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  te <= (int)pPage
de20: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
de30: 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  e );.  *pIdx = t
de40: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
de50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
de60: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
de70: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
de80: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
de90: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
dea0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
deb0: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
dec0: 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 69  s pPage->aData[i
ded0: 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  Start].** and th
dee0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
def0: 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79 74  ock is iSize byt
df00: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65  es..**.** Adjace
df10: 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61 72  nt freeblocks ar
df20: 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a  e coalesced..**.
df30: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76 65  ** Note that eve
df40: 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72 65  n though the fre
df50: 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73 20  eblock list was 
df60: 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65 65  checked by btree
df70: 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74  InitPage(),.** t
df80: 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  hat routine will
df90: 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65 72   not detect over
dfa0: 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  lap between cell
dfb0: 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e  s or freeblocks.
dfc0: 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74    Nor.** does it
dfd0: 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f 72   detect cells or
dfe0: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
dff0: 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20 74   encrouch into t
e000: 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74 65  he reserved byte
e010: 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20  s.** at the end 
e020: 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53 6f  of the page.  So
e030: 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   do additional c
e040: 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b 73  orruption checks
e050: 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a 20   inside this.** 
e060: 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74 75  routine and retu
e070: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
e080: 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d  T if any problem
e090: 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  s are found..*/.
e0a0: 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53  static int freeS
e0b0: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
e0c0: 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74 2c  age, u16 iStart,
e0d0: 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20 75   u16 iSize){.  u
e0e0: 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20 20  16 iPtr;        
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e110: 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20 66  of ptr to next f
e120: 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31  reeblock */.  u1
e130: 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20 20  6 iFreeBlk;     
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e150: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
e160: 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 62  f the next freeb
e170: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72  lock */.  u8 hdr
e180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1a0: 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20 73  /* Page header s
e1b0: 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20 2a  ize.  0 or 100 *
e1c0: 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20 30  /.  u8 nFrag = 0
e1d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e1e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 64            /* Red
e1f0: 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65  uction in fragme
e200: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36  ntation */.  u16
e210: 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53 69   iOrigSize = iSi
e220: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
e230: 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
e240: 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f  alue of iSize */
e250: 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20 20 20  .  u16 x;       
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e270: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
e280: 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
e290: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33 32  nt area */.  u32
e2a0: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
e2b0: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
e2c0: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
e2d0: 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74   past the iStart
e2e0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73   buffer */.  uns
e2f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
e300: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
e310: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65     /* Page conte
e320: 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
e330: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
e340: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
e350: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
e360: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
e370: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
e380: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
e390: 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  Start>=pPage->hd
e3a0: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
e3b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
e3c0: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
e3d0: 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d  PT_DB || iEnd <=
e3e0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
e3f0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
e400: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e410: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
e420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e430: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
e440: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
e450: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
e460: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
e470: 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d  art<=pPage->pBt-
e480: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b  >usableSize-4 );
e490: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
e4a0: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
e4b0: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
e4c0: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
e4d0: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
e4e0: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
e4f0: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
e500: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
e510: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
e520: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
e530: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
e540: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
e550: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
e560: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
e570: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
e580: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
e590: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
e5a0: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
e5b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
e5c0: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
e5d0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e5e0: 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29  iPtr]))<iStart )
e5f0: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  {.      if( iFre
e600: 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20  eBlk<iPtr+4 ){. 
e610: 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65         if( iFree
e620: 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Blk==0 ) break;.
e630: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e640: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e650: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
e660: 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20   }.      iPtr = 
e670: 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a  iFreeBlk;.    }.
e680: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e690: 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
e6a0: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
e6b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e6c0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
e6d0: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
e6e0: 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b  assert( iFreeBlk
e6f0: 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c  >iPtr || iFreeBl
e700: 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f  k==0 );.  .    /
e710: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a  * At this point:
e720: 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65  .    **    iFree
e730: 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65  Blk:   First fre
e740: 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74  eblock after iSt
e750: 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20  art, or zero if 
e760: 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69  none.    **    i
e770: 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20 61  Ptr:       The a
e780: 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e  ddress of a poin
e790: 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a  ter to iFreeBlk.
e7a0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68      **.    ** Ch
e7b0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46  eck to see if iF
e7c0: 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65  reeBlk should be
e7d0: 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20   coalesced onto 
e7e0: 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72  the end of iStar
e7f0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
e800: 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45  ( iFreeBlk && iE
e810: 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29  nd+3>=iFreeBlk )
e820: 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20  {.      nFrag = 
e830: 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b  iFreeBlk - iEnd;
e840: 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e  .      if( iEnd>
e850: 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72  iFreeBlk ) retur
e860: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e870: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
e880: 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65      iEnd = iFree
e890: 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26  Blk + get2byte(&
e8a0: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d  data[iFreeBlk+2]
e8b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  );.      if( iEn
e8c0: 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  d > pPage->pBt->
e8d0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
e8e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
e8f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
e900: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
e910: 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69  .      iSize = i
e920: 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20  End - iStart;.  
e930: 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67      iFreeBlk = g
e940: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
e950: 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a  reeBlk]);.    }.
e960: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74    .    /* If iPt
e970: 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65  r is another fre
e980: 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c  eblock (that is,
e990: 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20   if iPtr is not 
e9a0: 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20  the freelist.   
e9b0: 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74   ** pointer in t
e9c0: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20  he page header) 
e9d0: 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65  then check to se
e9e0: 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75  e if iStart shou
e9f0: 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61  ld be.    ** coa
ea00: 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20  lesced onto the 
ea10: 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20  end of iPtr..   
ea20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72   */.    if( iPtr
ea30: 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20  >hdr+1 ){.      
ea40: 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50  int iPtrEnd = iP
ea50: 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  tr + get2byte(&d
ea60: 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20  ata[iPtr+2]);.  
ea70: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b      if( iPtrEnd+
ea80: 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20  3>=iStart ){.   
ea90: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
eaa0: 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e  >iStart ) return
eab0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
eac0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
ead0: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
eae0: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
eaf0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
eb00: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
eb10: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
eb20: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
eb30: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
eb40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
eb50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
eb60: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
eb70: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
eb80: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
eb90: 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64   x = get2byte(&d
eba0: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69  ata[hdr+5]);.  i
ebb0: 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29 7b 0a  f( iStart<=x ){.
ebc0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
ebd0: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
ebe0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
ebf0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
ec00: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
ec10: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
ec20: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
ec30: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
ec40: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
ec50: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
ec60: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
ec70: 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74 72 21  Start<x || iPtr!
ec80: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
ec90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
eca0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
ecb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
ecc0: 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29  dr+1], iFreeBlk)
ecd0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
ece0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e  data[hdr+5], iEn
ecf0: 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
ed00: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
ed10: 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74  ew freeblock int
ed20: 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  o the freelist *
ed30: 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  /.    put2byte(&
ed40: 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61  data[iPtr], iSta
ed50: 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rt);.  }.  if( p
ed60: 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c  Page->pBt->btsFl
ed70: 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
ed80: 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ECURE ){.    /* 
ed90: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
eda0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
edb0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
edc0: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
edd0: 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73      ** option is
ede0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20   enabled */.    
edf0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
ee00: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
ee10: 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65 28  .  }.  put2byte(
ee20: 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69  &data[iStart], i
ee30: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74 32  FreeBlk);.  put2
ee40: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
ee50: 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20  t+2], iSize);.  
ee60: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
ee70: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
ee80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
ee90: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
eea0: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
eeb0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
eec0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
eed0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
eee0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
eef0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
ef00: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
ef10: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
ef20: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
ef30: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
ef40: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
ef50: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
ef60: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
ef70: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
ef80: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
ef90: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
efa0: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
efb0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
efc0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
efd0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
efe0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
eff0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
f000: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
f010: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
f020: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
f030: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
f040: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
f050: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f060: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
f070: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
f080: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
f090: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
f0a0: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
f0b0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
f0c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f0d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
f0e0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
f0f0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
f100: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
f110: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
f120: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
f130: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
f140: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
f150: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
f160: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
f170: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
f180: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
f190: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
f1a0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
f1b0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
f1c0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
f1d0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
f1e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
f1f0: 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75  291-35328 A valu
f200: 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65  e of 5 (0x05) me
f210: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
f220: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
f230: 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  or table b-tree 
f240: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
f250: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
f260: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
f270: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
f280: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30  ENCE-OF: R-26900
f290: 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f  -09176 A value o
f2a0: 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e  f 13 (0x0d) mean
f2b0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
f2c0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c      ** leaf tabl
f2d0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
f2e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f2f0: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
f300: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
f310: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
f320: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
f330: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
f340: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
f350: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
f360: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
f370: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
f380: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a  eeParseCellPtr;.
f390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f3a0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
f3b0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  af = 0;.      pP
f3c0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
f3d0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
f3e0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
f3f0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
f400: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
f410: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
f420: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
f430: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
f440: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
f450: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f460: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
f470: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
f480: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
f490: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
f4a0: 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33  -OF: R-43316-373
f4b0: 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  08 A value of 2 
f4c0: 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65  (0x02) means the
f4d0: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
f4e0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65  ** interior inde
f4f0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f500: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f510: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
f520: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
f530: 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34  CE-OF: R-59615-4
f540: 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  2828 A value of 
f550: 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20  10 (0x0a) means 
f560: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
f570: 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20    ** leaf index 
f580: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
f590: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
f5a0: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
f5b0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
f5c0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
f5d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
f5e0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
f5f0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
f600: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
f610: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
f620: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
f630: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
f640: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
f650: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
f660: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
f670: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f680: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
f690: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
f6a0: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
f6b0: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
f6c0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
f6d0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
f6e0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
f6f0: 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  (pPage);.  }.  p
f700: 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
f710: 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78  yload = pBt->max
f720: 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20  1bytePayload;.  
f730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f740: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
f750: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
f760: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
f770: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
f780: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
f790: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
f7a0: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
f7b0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
f7c0: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
f7d0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
f7e0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
f7f0: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
f800: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
f810: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
f820: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
f830: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
f840: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
f850: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
f860: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
f870: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
f880: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
f890: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
f8a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
f8b0: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
f8c0: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
f8d0: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
f8e0: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
f8f0: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
f900: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
f910: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
f920: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
f930: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
f940: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
f950: 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
f960: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
f970: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
f980: 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
f990: 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Bt;        /* Th
f9a0: 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72  e main btree str
f9b0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
f9c0: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
f9d0: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
f9e0: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
f9f0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36 20 63   page */.  u16 c
fa00: 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  ellOffset;    /*
fa10: 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61   Offset from sta
fa20: 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69  rt of page to fi
fa30: 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
fa40: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
fa50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
fa60: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
fa70: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
fa80: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
fa90: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
faa0: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
fab0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
fac0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
fad0: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
fae0: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
faf0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
fb00: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  t */.  int iCell
fb10: 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73  Last;     /* Las
fb20: 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20  t possible cell 
fb30: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
fb40: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
fb50: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
fb60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fb70: 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29  ge->pBt->db!=0 )
fb80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fb90: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fba0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
fbb0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
fbc0: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
fbd0: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
fbe0: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
fbf0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
fc00: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
fc10: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
fc20: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
fc30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
fc40: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
fc50: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
fc60: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fc70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
fc80: 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  e->isInit==0 );.
fc90: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
fca0: 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  pBt;.  hdr = pPa
fcb0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
fcc0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
fcd0: 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45  Data;.  /* EVIDE
fce0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d  NCE-OF: R-28594-
fcf0: 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79  02890 The one-by
fd00: 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65  te flag at offse
fd10: 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20  t 0 indicating. 
fd20: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
fd30: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69  age type. */.  i
fd40: 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70  f( decodeFlags(p
fd50: 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29  Page, data[hdr])
fd60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fd70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
fd80: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
fd90: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
fda0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
fdb0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
fdc0: 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
fdd0: 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
fde0: 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
fdf0: 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f   1);.  pPage->nO
fe00: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75  verflow = 0;.  u
fe10: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
fe20: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70  >usableSize;.  p
fe30: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
fe40: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
fe50: 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d  hdr + 8 + pPage-
fe60: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
fe70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
fe80: 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53   = &data[usableS
fe90: 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  ize];.  pPage->a
fea0: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
feb0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70  cellOffset];.  p
fec0: 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20  Page->aDataOfst 
fed0: 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
fee0: 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
fef0: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
ff00: 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
ff10: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
ff20: 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
ff30: 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74  esignates.  ** t
ff40: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
ff50: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
ff60: 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20  a. A zero value 
ff70: 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67 65 72  for this integer
ff80: 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72   is.  ** interpr
ff90: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ffa0: 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79  /.  top = get2by
ffb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
ffc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56  hdr+5]);.  /* EV
ffd0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
ffe0: 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
fff0: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
10000 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
10010 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  the.  ** number 
10020 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
10030 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65  page. */.  pPage
10040 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
10050 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
10060 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
10070 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74  Cell>MX_CELL(pBt
10080 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d  ) ){.    /* To m
10090 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
100a0 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
100b0 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
100c0 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
100d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
100e0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
100f0 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
10100 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d   pPage->nCell==M
10110 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20  X_CELL(pBt) );. 
10120 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
10130 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20 49   R-24089-57979 I
10140 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  f a page contain
10150 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69 63  s no cells (whic
10160 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70  h is only.  ** p
10170 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f  ossible for a ro
10180 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot page of a tab
10190 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
101a0 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74   no rows) then t
101b0 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74 20 74  he.  ** offset t
101c0 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
101d0 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75  nt area will equ
101e0 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  al the page size
101f0 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20   minus the.  ** 
10200 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65  bytes of reserve
10210 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73  d space. */.  as
10220 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
10230 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
10240 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
10250 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41  PT_DB );..  /* A
10260 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62   malformed datab
10270 61 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63  ase page might c
10280 61 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20  ause us to read 
10290 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  past the end.  *
102a0 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70  * of page when p
102b0 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20  arsing a cell.  
102c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66  .  **.  ** The f
102d0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
102e0 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65 61  f code checks ea
102f0 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61 20  rly to see if a 
10300 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a  cell extends.  *
10310 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  * past the end o
10320 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72  f a page boundar
10330 79 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c  y and causes SQL
10340 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62  ITE_CORRUPT to b
10350 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e 65 64  e .  ** returned
10360 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a   if it does..  *
10370 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d  /.  iCellFirst =
10380 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
10390 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
103a0 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62  iCellLast = usab
103b0 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66  leSize - 4;.  if
103c0 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73  ( pBt->db->flags
103d0 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69   & SQLITE_CellSi
103e0 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20  zeCk ){.    int 
103f0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
10400 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20   Index into the 
10410 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
10420 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a  ay */.    int sz
10430 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
10440 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
10450 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
10460 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
10470 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  st--;.    for(i=
10480 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
10490 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
104a0 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
104b0 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
104c0 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
104d0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
104e0 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
104f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10500 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20  ==iCellLast );. 
10510 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c       if( pc<iCel
10520 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65  lFirst || pc>iCe
10530 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  llLast ){.      
10540 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10550 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10560 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
10570 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
10580 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
10590 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
105a0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73    testcase( pc+s
105b0 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  z==usableSize );
105c0 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a  .      if( pc+sz
105d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
105e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
105f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10600 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10610 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10620 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69  !pPage->leaf ) i
10630 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20  CellLast++;.  } 
10640 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20   ..  /* Compute 
10650 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73  the total free s
10660 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65  pace on the page
10670 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  ** EVIDENCE-O
10680 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
10690 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
106a0 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
106b0 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a  1 gives the.  **
106c0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
106d0 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
106e0 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
106f0 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
10700 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62  re no.  ** freeb
10710 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d  locks. */.  pc =
10720 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10730 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65  hdr+1]);.  nFree
10740 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b   = data[hdr+7] +
10750 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e   top;  /* Init n
10760 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65  Free to non-free
10770 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65  block free space
10780 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29   */.  if( pc>0 )
10790 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20  {.    u32 next, 
107a0 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
107b0 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20  <iCellFirst ){. 
107c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
107d0 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39  -OF: R-55530-529
107e0 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  30 In a well-for
107f0 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c  med b-tree page,
10800 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20   there will.    
10810 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
10820 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
10830 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
10840 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
10850 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
10860 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10870 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20 0a  T_PAGE(pPage); .
10880 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
10890 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   1 ){.      if( 
108a0 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
108b0 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62          /* Freeb
108c0 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64  lock off the end
108d0 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
108e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
108f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
10900 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
10910 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
10920 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
10930 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
10940 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10950 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e  [pc+2]);.      n
10960 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73  Free = nFree + s
10970 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  ize;.      if( n
10980 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
10990 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63   break;.      pc
109a0 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
109b0 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b     if( next>0 ){
109c0 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c  .      /* Freebl
109d0 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e  ock not in ascen
109e0 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
109f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10a00 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10a10 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
10a20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e   if( pc+size>(un
10a30 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c  signed int)usabl
10a40 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
10a50 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b  * Last freeblock
10a60 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70 61   extends past pa
10a70 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20  ge end */.      
10a80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10a90 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10aa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
10ab0 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
10ac0 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73  , nFree contains
10ad0 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
10ae0 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
10af0 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
10b00 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10b10 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
10b20 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
10b30 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20  within.  ** the 
10b40 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
10b50 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
10b60 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
10b70 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20  sable-size.  ** 
10b80 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
10b90 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
10ba0 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
10bb0 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
10bc0 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72  ** serves to ver
10bd0 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66  ify that the off
10be0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
10bf0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e   of the cell-con
10c00 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20  tent.  ** area, 
10c10 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
10c20 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69   page header, li
10c30 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
10c40 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ge..  */.  if( n
10c50 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  Free>usableSize 
10c60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
10c70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10c80 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
10c90 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
10ca0 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65  u16)(nFree - iCe
10cb0 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50 61 67  llFirst);.  pPag
10cc0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20  e->isInit = 1;. 
10cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10ce0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
10cf0 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
10d00 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
10d10 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
10d20 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
10d30 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
10d40 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
10d50 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
10d60 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
10d70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10d80 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
10d90 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
10da0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
10db0 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
10dc0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
10dd0 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
10de0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
10df0 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
10e00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
10e10 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
10e20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10e30 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
10e40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
10e50 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
10e60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10e70 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
10e80 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
10e90 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
10ea0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
10eb0 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
10ec0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
10ed0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10ee0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10ef0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
10f00 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
10f10 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
10f20 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
10f30 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
10f40 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10f50 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
10f60 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
10f70 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
10f80 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
10f90 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
10fa0 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
10fb0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
10fc0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
10fd0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
10fe0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
10ff0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
11000 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
11010 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
11020 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
11030 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
11040 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
11050 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
11060 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
11070 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
11080 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
11090 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
110a0 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
110b0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
110c0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
110d0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
110e0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
110f0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
11100 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
11110 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
11120 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
11130 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
11140 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
11150 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
11160 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
11170 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
11180 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
11190 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
111a0 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
111b0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
111c0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
111d0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
111e0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
111f0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
11200 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
11210 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
11220 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
11230 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
11240 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
11250 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
11260 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11270 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
11280 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65   if( pgno!=pPage
11290 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
112a0 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
112b0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
112c0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70  (pDbPage);.    p
112d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
112e0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61  pDbPage;.    pPa
112f0 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
11300 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
11310 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65   pgno;.    pPage
11320 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
11330 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
11340 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
11350 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  Page->aData==sql
11360 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11370 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  (pDbPage) );.  r
11380 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
11390 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
113a0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
113b0 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
113c0 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
113d0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
113e0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
113f0 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f  eeded.  See also
11400 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  : btreeGetUnused
11410 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
11420 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
11430 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73  OCONTENT flag is
11440 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
11450 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
11460 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  re.** about the 
11470 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
11480 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
11490 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
114a0 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
114b0 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
114c0 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
114d0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
114e0 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
114f0 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
11500 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
11510 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
11520 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
11530 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
11540 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
11550 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
11560 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
11570 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
11580 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
11590 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
115a0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
115b0 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
115c0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
115d0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
115e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
115f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
11600 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
11610 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
11620 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
11630 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
11640 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
11650 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
11660 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
11670 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
11680 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
11690 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
116a0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
116b0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
116c0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
116d0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
116e0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
116f0 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
11700 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
11710 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11720 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11730 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11740 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11750 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
11760 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
11770 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
11780 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
11790 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
117a0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
117b0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
117c0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
117d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
117e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
117f0 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
11800 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
11810 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
11820 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
11830 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
11840 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
11850 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
11860 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
11870 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
11880 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
11890 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
118a0 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
118b0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
118c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
118d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
118e0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
118f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11900 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
11910 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
11920 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
11930 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
11940 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
11950 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
11960 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
11970 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
11980 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
11990 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
119a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
119b0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
119c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
119d0 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
119e0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
119f0 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
11a00 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
11a10 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
11a20 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
11a30 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
11a40 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
11a50 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
11a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
11a70 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
11a80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11a90 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
11aa0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
11ab0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
11ac0 65 29 26 30 78 38 30 30 30 30 30 30 30 29 3d 3d  e)&0x80000000)==
11ad0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74  0 );.  return bt
11ae0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
11af0 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
11b00 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
11b10 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
11b20 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a  tialize it..**.*
11b30 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65  * If pCur!=0 the
11b40 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
11b50 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70  ing fetched as p
11b60 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43  art of a moveToC
11b70 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20  hild().** call. 
11b80 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73   Do additional s
11b90 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
11ba0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
11bb0 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20  is case..** And 
11bc0 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69  if the fetch fai
11bd0 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ls, this routine
11be0 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20   must decrement 
11bf0 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a  pCur->iPage..**.
11c00 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66  ** The page is f
11c10 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77  etched as read-w
11c20 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72  rite unless pCur
11c30 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
11c40 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e   is.** a read-on
11c50 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ly cursor..**.**
11c60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11c70 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  urs, then *ppPag
11c80 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
11c90 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
11ca0 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
11cb0 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
11cc0 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
11cd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11ce0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
11cf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
11d20 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
11d30 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
11d40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
11d50 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
11d60 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
11d70 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d90 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
11da0 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
11db0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
11dc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dd0 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
11de0 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c  eceive the page,
11df0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
11e00 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20  t bReadOnly     
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e20 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
11e30 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b  -only page */.){
11e40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
11e50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
11e60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11e70 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11e80 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
11e90 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
11ea0 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50  pPage==&pCur->pP
11eb0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
11ec0 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61   pCur==0 || bRea
11ed0 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72  dOnly==pCur->cur
11ee0 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20  PagerFlags );.  
11ef0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
11f00 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  || pCur->iPage>0
11f10 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e   );..  if( pgno>
11f20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11f30 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Bt) ){.    rc = 
11f40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11f50 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  KPT;.    goto ge
11f60 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
11f70 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  or;.  }.  rc = s
11f80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
11f90 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
11fa0 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62  , (DbPage**)&pDb
11fb0 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29  Page, bReadOnly)
11fc0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
11fd0 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
11fe0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  tPage_error;.  }
11ff0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65  .  *ppPage = (Me
12000 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
12010 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
12020 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70  age);.  if( (*pp
12030 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30  Page)->isInit==0
12040 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67   ){.    btreePag
12050 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
12060 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
12070 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
12080 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29  nitPage(*ppPage)
12090 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
120a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
120b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
120c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Page);.      got
120d0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
120e0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
120f0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  }.  assert( (*pp
12100 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e  Page)->pgno==pgn
12110 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  o );.  assert( (
12120 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d  *ppPage)->aData=
12130 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
12140 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
12150 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e  ..  /* If obtain
12160 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67 65  ing a child page
12170 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77   for a cursor, w
12180 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68  e must verify th
12190 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20  at the page is. 
121a0 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   ** compatible w
121b0 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ith the root pag
121c0 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  e. */.  if( pCur
121d0 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e   && ((*ppPage)->
121e0 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50  nCell<1 || (*ppP
121f0 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43  age)->intKey!=pC
12200 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29  ur->curIntKey) )
12210 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
12220 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70  E_CORRUPT_PGNO(p
12230 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  gno);.    releas
12240 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12250 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12260 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12270 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
12280 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
12290 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
122a0 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
122b0 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20  pCur->iPage--;. 
122c0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d     pCur->pPage =
122d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
122e0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a  ur->iPage];.  }.
122f0 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f    testcase( pgno
12300 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
12310 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d   pgno!=0 || rc==
12320 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
12330 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12340 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
12350 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73  a MemPage.  This
12360 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
12370 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
12380 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f  prior.** call to
12390 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a   btreeGetPage..*
123a0 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20 61 20  *.** Page1 is a 
123b0 73 70 65 63 69 61 6c 20 63 61 73 65 20 61 6e 64  special case and
123c0 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65   must be release
123d0 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73 65 50  d using releaseP
123e0 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61  ageOne()..*/.sta
123f0 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
12400 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50  PageNotNull(MemP
12410 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
12420 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44  ssert( pPage->aD
12430 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
12440 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
12450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12460 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20  pDbPage!=0 );.  
12470 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12480 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
12490 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
124a0 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
124b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
124c0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
124d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
124e0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
124f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12500 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12510 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12520 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
12530 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61  UnrefNotNull(pPa
12540 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a  ge->pDbPage);.}.
12550 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
12560 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  asePage(MemPage 
12570 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70  *pPage){.  if( p
12580 50 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61  Page ) releasePa
12590 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29  geNotNull(pPage)
125a0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
125b0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 4d  releasePageOne(M
125c0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
125d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 21    assert( pPage!
125e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
125f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
12600 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12610 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74  >pBt );.  assert
12620 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ( pPage->pDbPage
12630 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12640 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
12650 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
12660 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
12670 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
12680 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12690 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
126a0 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61  bPage)==pPage->a
126b0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
126c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
126d0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
126e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
126f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 50 61  ite3PagerUnrefPa
12700 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70 44 62  geOne(pPage->pDb
12710 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
12720 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61  Get an unused pa
12730 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  ge..**.** This w
12740 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62  orks just like b
12750 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77 69  treeGetPage() wi
12760 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a  th the addition:
12770 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74  .**.**   *  If t
12780 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
12790 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f  dy in use for so
127a0 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
127b0 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  , immediately.**
127c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69 74        release it
127d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
127e0 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65 72  QLITE_CURRUPT er
127f0 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b  ror..**   *  Mak
12800 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e 69  e sure the isIni
12810 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a  t flag is clear.
12820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
12830 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
12840 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
12850 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
12860 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  btree */.  Pgno 
12870 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
12880 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
12890 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a   page to fetch *
128a0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
128b0 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75  Page,    /* Retu
128c0 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  rn the page in t
128d0 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f  his parameter */
128e0 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
128f0 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
12900 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f  _GET_NOCONTENT o
12910 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  r PAGER_GET_READ
12920 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ONLY */.){.  int
12930 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
12940 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70  ge(pBt, pgno, pp
12950 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Page, flags);.  
12960 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12970 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  K ){.    if( sql
12980 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
12990 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
129a0 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20  >pDbPage)>1 ){. 
129b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
129c0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
129d0 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
129e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
129f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
12a00 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61      }.    (*ppPa
12a10 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  ge)->isInit = 0;
12a20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
12a30 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  pPage = 0;.  }. 
12a40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
12a50 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
12a60 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
12a70 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
12a80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
12a90 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
12aa0 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
12ab0 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
12ac0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
12ad0 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
12ae0 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
12af0 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
12b00 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
12b10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
12b20 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
12b30 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
12b40 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
12b50 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
12b60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
12b70 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
12b80 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
12b90 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
12ba0 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
12bb0 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
12bc0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
12bd0 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
12be0 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
12bf0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
12c00 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
12c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12c20 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
12c30 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  >0 );.  if( pPag
12c40 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
12c50 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12c60 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
12c70 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
12c80 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
12c90 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nit = 0;.    if(
12ca0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
12cb0 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29  eRefcount(pData)
12cc0 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  >1 ){.      /* p
12cd0 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  Page might not b
12ce0 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b 20  e a btree page; 
12cf0 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20   it might be an 
12d00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
12d10 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70      ** or ptrmap
12d20 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65 20   page or a free 
12d30 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20  page.  In those 
12d40 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f  cases, the follo
12d50 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61  wing.      ** ca
12d60 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50  ll to btreeInitP
12d70 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c  age() will likel
12d80 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
12d90 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a  CORRUPT..      *
12da0 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73  * But no harm is
12db0 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20   done by this.  
12dc0 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69  And it is very i
12dd0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20  mportant that.  
12de0 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74      ** btreeInit
12df0 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64  Page() be called
12e00 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65 20   on every btree 
12e10 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a  page so we make.
12e20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c        ** the cal
12e30 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67 65  l for every page
12e40 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66   that comes in f
12e50 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a  or re-initing. *
12e60 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e 69  /.      btreeIni
12e70 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
12e80 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
12e90 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
12ea0 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62   handler for a b
12eb0 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tree..*/.static 
12ec0 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  int btreeInvokeB
12ed0 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
12ee0 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72  *pArg){.  BtShar
12ef0 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61  ed *pBt = (BtSha
12f00 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73  red*)pArg;.  ass
12f10 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a  ert( pBt->db );.
12f20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
12f30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
12f40 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
12f50 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12f60 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
12f70 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79  r(&pBt->db->busy
12f80 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20 20 20 20  Handler,.       
12f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fa0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12fb0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
12fc0 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a  >pPager));.}../*
12fd0 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
12fe0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
12ff0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
13000 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
13010 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
13020 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
13030 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
13040 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
13050 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
13060 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
13070 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
13080 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
13090 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
130a0 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
130b0 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
130c0 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
130d0 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
130e0 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
130f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13100 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
13110 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
13120 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
13130 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
13140 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
13150 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
13160 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
13170 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
13180 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13190 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
131a0 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
131b0 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
131c0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
131d0 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
131e0 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
131f0 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
13200 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
13210 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
13220 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
13230 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
13240 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
13250 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13260 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
13270 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
13280 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
13290 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
132a0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
132b0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
132c0 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
132d0 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
132e0 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
132f0 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
13300 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13310 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
13320 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
13330 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
13340 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
13350 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
13360 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
13370 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
13380 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
13390 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
133a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
133b0 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
133c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
133d0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
133e0 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
133f0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
13400 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
13410 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
13420 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
13430 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
13440 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
13450 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
13460 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
13470 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
13480 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13490 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
134a0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
134b0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
134c0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
134d0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
134e0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
134f0 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
13500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
13510 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
13520 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
13530 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13550 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
13560 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
13570 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
13580 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
13590 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
135a0 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
135b0 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
135c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
135d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
135e0 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
135f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
13600 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13620 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
13630 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
13640 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
13650 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
13660 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
13670 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
13680 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
13690 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
136a0 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
136b0 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
136c0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
136d0 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
136e0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
136f0 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
13700 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
13710 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
13720 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
13730 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
13740 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
13750 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
13760 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
13770 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
13780 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
13790 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
137a0 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
137b0 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
137c0 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
137d0 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
137e0 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
137f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13800 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
13810 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
13820 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
13850 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
13860 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
13870 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
13880 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
13890 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
138a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
138b0 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
138c0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
138d0 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
138e0 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
138f0 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
13900 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
13910 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
13920 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
13930 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
13940 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
13950 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
13960 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
13970 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
13980 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
13990 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
139a0 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
139b0 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
139c0 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
139d0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
139e0 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
139f0 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
13a00 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
13a10 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
13a20 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
13a30 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
13a40 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
13a50 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
13a60 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
13a70 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
13a80 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
13a90 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
13aa0 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
13ab0 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
13ac0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
13ad0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
13ae0 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
13af0 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
13b00 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
13b10 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  T;.  }.  p->inTr
13b20 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
13b30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
13b40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b50 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
13b60 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
13b70 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
13b80 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
13b90 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
13ba0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
13bb0 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
13bc0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13bd0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
13be0 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
13bf0 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
13c00 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
13c10 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
13c20 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
13c30 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
13c40 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
13c50 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
13c60 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
13c70 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
13c80 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
13c90 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
13ca0 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
13cb0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13cc0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
13cd0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
13ce0 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
13cf0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
13d00 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
13d10 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
13d20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
13d30 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
13d40 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
13d50 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
13d60 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
13d70 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
13d80 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
13d90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
13da0 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
13db0 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
13dc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
13dd0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
13de0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
13df0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
13e00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13e10 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13e20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
13e30 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
13e40 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
13e50 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
13e60 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
13e70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13e80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13e90 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
13ea0 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ed0 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
13ee0 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
13ef0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13f10 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
13f20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
13f30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13f40 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
13f50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13f60 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
13f70 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
13f80 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
13f90 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
13fa0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
13fb0 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
13fc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
13fd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13fe0 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
13ff0 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
14000 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
14010 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14020 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
14030 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
14040 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
14050 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
14060 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
14070 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
14080 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
14090 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
140a0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
140b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
140c0 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
140d0 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
140e0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
140f0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
14100 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
14110 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
14120 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
14130 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
14140 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
14150 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
14160 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
14170 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
14180 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
14190 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
141a0 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
141b0 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
141c0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
141d0 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
141e0 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
141f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14210 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
14230 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14240 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14260 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
14270 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
14280 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14290 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
142a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
142b0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
142c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
142d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
142e0 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
142f0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
14300 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
14310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14320 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14330 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14340 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
14350 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
14360 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
14370 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
14380 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
14390 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
143a0 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
143b0 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
143c0 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
143d0 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
143e0 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
143f0 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
14400 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
14410 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
14420 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
14430 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
14440 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
14450 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
14460 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
14470 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
14480 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
14490 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
144a0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
144b0 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
144c0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
144d0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
144e0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
144f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
14500 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
14510 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
14520 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
14530 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
14540 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
14550 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
14560 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
14570 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
14580 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
14590 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
145a0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
145b0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
145c0 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
145d0 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
145e0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
145f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
14600 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
14610 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14620 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
14630 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14640 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
14650 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
14660 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
14670 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
14680 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
14690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
146a0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
146b0 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
146c0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
146d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
146e0 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
146f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
14700 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
14710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14720 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65    sizeof(MemPage
14730 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  ), flags, vfsFla
14740 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
14750 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
14760 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14770 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
14780 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
14790 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
147a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
147b0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
147c0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
147d0 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
147e0 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
147f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14810 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
14820 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
14830 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
14840 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
14850 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
14860 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
14870 50 61 67 65 72 53 65 74 42 75 73 79 48 61 6e 64  PagerSetBusyHand
14880 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
14890 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
148a0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
148b0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
148c0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
148d0 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
148e0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
148f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
14900 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
14910 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
14920 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
14930 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
14940 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14950 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20  SECURE_DELETE). 
14960 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
14970 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
14980 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65 66  ELETE;.#elif def
14990 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53 54  ined(SQLITE_FAST
149a0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
149b0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
149c0 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52 49  s |= BTS_OVERWRI
149d0 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  TE;.#endif.    /
149e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
149f0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
14a00 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
14a10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
14a20 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
14a30 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
14a40 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
14a50 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
14a60 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
14a70 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
14a80 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
14a90 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
14aa0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
14ab0 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36 5d  = (zDbHeader[16]
14ac0 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64 65  <<8) | (zDbHeade
14ad0 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  r[17]<<16);.    
14ae0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
14af0 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61  e<512 || pBt->pa
14b00 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
14b10 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20  X_PAGE_SIZE.    
14b20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70       || ((pBt->p
14b30 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e  ageSize-1)&pBt->
14b40 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a  pageSize)!=0 ){.
14b50 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
14b60 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ize = 0;.#ifndef
14b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
14b80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
14b90 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
14ba0 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
14bb0 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
14bc0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
14bd0 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
14be0 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
14bf0 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
14c00 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
14c10 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
14c20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
14c30 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
14c40 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
14c50 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
14c60 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
14c70 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
14c80 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
14c90 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
14ca0 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
14cb0 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
14cc0 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
14cd0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
14ce0 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
14cf0 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
14d00 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
14d10 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
14d20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
14d30 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
14d40 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
14d50 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
14d60 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
14d70 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
14d80 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
14d90 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
14da0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
14db0 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
14dc0 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
14dd0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  e{.      /* EVID
14de0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
14df0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
14e00 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
14e10 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  region is.      
14e20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
14e30 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
14e40 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
14e50 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
14e60 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a 2a  t of 20.      **
14e70 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
14e80 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
14e90 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  */.      nReserv
14ea0 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
14eb0 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ];.      pBt->bt
14ec0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
14ed0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
14ee0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14ef0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14f00 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
14f10 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
14f20 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34  zDbHeader[36 + 4
14f30 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20  *4])?1:0);.     
14f40 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
14f50 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
14f60 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34  bHeader[36 + 7*4
14f70 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
14f80 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
14f90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
14fa0 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
14fb0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
14fc0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
14fd0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
14fe0 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
14ff0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
15000 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
15010 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
15020 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42  .    assert( (pB
15030 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29  t->pageSize & 7)
15040 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74  ==0 );  /* 8-byt
15050 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70  e alignment of p
15060 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23  ageSize */.   .#
15070 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
15080 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
15090 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
150a0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
150b0 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64  SKIO).    /* Add
150c0 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72 65   the new BtShare
150d0 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  d object to the 
150e0 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72  linked list shar
150f0 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a  able BtShareds..
15100 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e      */.    pBt->
15110 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69 66  nRef = 1;.    if
15120 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
15130 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
15140 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
15150 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
15160 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ).      MUTEX_LO
15170 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64  GIC( mutexShared
15180 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15190 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
151a0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
151b0 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  ;).      if( SQL
151c0 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26  ITE_THREADSAFE &
151d0 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  & sqlite3GlobalC
151e0 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
151f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
15200 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
15210 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15220 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20  E_MUTEX_FAST);. 
15230 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
15240 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
15250 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15260 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
15270 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72          goto btr
15280 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
15290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
152a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
152b0 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
152c0 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74  ared);.      pBt
152d0 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c  ->pNext = GLOBAL
152e0 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
152f0 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15300 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c  t);.      GLOBAL
15310 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15320 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15330 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  t) = pBt;.      
15340 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15350 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
15360 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
15370 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64   }..#if !defined
15380 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15390 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
153a0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
153b0 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20  IT_DISKIO).  /* 
153c0 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65  If the new Btree
153d0 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65   uses a sharable
153e0 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e   pBtShared, then
153f0 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20   link the new.  
15400 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68  ** Btree into th
15410 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68  e list of all sh
15420 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f  arable Btrees fo
15430 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65  r the same conne
15440 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20  ction..  ** The 
15450 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20  list is kept in 
15460 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
15470 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a  by pBt address..
15480 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68    */.  if( p->sh
15490 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e  arable ){.    in
154a0 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a  t i;.    Btree *
154b0 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d  pSib;.    for(i=
154c0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
154d0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  +){.      if( (p
154e0 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  Sib = db->aDb[i]
154f0 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62  .pBt)!=0 && pSib
15500 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
15510 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
15520 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62  b->pPrev ){ pSib
15530 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20   = pSib->pPrev; 
15540 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 75  }.        if( (u
15550 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74 72  ptr)p->pBt<(uptr
15560 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  )pSib->pBt ){.  
15570 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15580 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
15590 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
155a0 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
155b0 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
155c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
155d0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
155e0 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74 72  ->pNext && (uptr
155f0 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42  )pSib->pNext->pB
15600 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20 29  t<(uptr)p->pBt )
15610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
15620 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
15630 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15640 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
15650 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
15660 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
15670 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
15680 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
15690 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
156a0 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
156b0 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
156c0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
156d0 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
156e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
156f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
15700 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
15710 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
15720 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
15730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15740 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
15750 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
15760 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
15770 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
15780 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  ->pPager, 0);.  
15790 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
157a0 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 73  free(pBt);.    s
157b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
157c0 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20 30      *ppBtree = 0
157d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
157e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
157f0 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  le;..    /* If t
15800 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73 75  he B-Tree was su
15810 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65  ccessfully opene
15820 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65 72  d, set the pager
15830 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74  -cache size to t
15840 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c  he.    ** defaul
15850 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c  t value. Except,
15860 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e   when opening on
15870 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
15880 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
15890 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63  .    ** do not c
158a0 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d  hange the pager-
158b0 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20  cache size..    
158c0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
158d0 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c  e3BtreeSchema(p,
158e0 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20   0, 0)==0 ){.   
158f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
15900 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70  etCachesize(p->p
15910 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
15920 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
15930 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20  _SIZE);.    }.. 
15940 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74     pFile = sqlit
15950 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
15960 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
15970 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
15980 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
15990 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48  e3OsFileControlH
159a0 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49 54  int(pFile, SQLIT
159b0 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f  E_FCNTL_PDB, (vo
159c0 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20  id*)&pBt->db);. 
159d0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d     }.  }.  if( m
159e0 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
159f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15a00 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
15a10 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
15a20 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15a30 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
15a40 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
15a50 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69  QLITE_OK || sqli
15a60 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74 69  te3BtreeConnecti
15a70 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65 65  onCount(*ppBtree
15a80 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  )>0 );.  return 
15a90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
15aa0 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
15ab0 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
15ac0 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
15ad0 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
15ae0 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
15af0 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
15b00 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
15b10 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
15b20 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
15b30 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
15b40 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
15b50 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
15b60 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
15b70 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
15b80 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
15b90 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
15ba0 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
15bb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15bc0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 4d  SHARED_CACHE.  M
15bd0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
15be0 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74  te3_mutex *pMast
15bf0 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65 64  er; ).  BtShared
15c00 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72   *pList;.  int r
15c10 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61  emoved = 0;..  a
15c20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
15c30 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74  utex_notheld(pBt
15c40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d 55  ->mutex) );.  MU
15c50 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74  TEX_LOGIC( pMast
15c60 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
15c70 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15c80 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
15c90 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f  R); ).  sqlite3_
15ca0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73  mutex_enter(pMas
15cb0 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65  ter);.  pBt->nRe
15cc0 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  f--;.  if( pBt->
15cd0 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69  nRef<=0 ){.    i
15ce0 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72  f( GLOBAL(BtShar
15cf0 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65  ed*,sqlite3Share
15d00 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42 74  dCacheList)==pBt
15d10 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c   ){.      GLOBAL
15d20 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15d30 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15d40 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  t) = pBt->pNext;
15d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15d60 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c    pList = GLOBAL
15d70 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74  (BtShared*,sqlit
15d80 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
15d90 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  t);.      while(
15da0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 26   ALWAYS(pList) &
15db0 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d  & pList->pNext!=
15dc0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70  pBt ){.        p
15dd0 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78  List=pList->pNex
15de0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
15df0 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69 73   if( ALWAYS(pLis
15e00 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t) ){.        pL
15e10 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  ist->pNext = pBt
15e20 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
15e30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 53  .    }.    if( S
15e40 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
15e50 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15e60 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42 74  3_mutex_free(pBt
15e70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a  ->mutex);.    }.
15e80 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b      removed = 1;
15e90 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
15ea0 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
15eb0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  er);.  return re
15ec0 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72  moved;.#else.  r
15ed0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
15ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
15ef0 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
15f00 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
15f10 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
15f20 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
15f30 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61 20  t) bytes with a 
15f40 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66 6f  4-byte prefix fo
15f50 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a  r a left-child.*
15f60 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74  * pointer..*/.st
15f70 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61  atic void alloca
15f80 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  teTempSpace(BtSh
15f90 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66  ared *pBt){.  if
15fa0 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  ( !pBt->pTmpSpac
15fb0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
15fc0 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
15fd0 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74  3PageMalloc( pBt
15fe0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20  ->pageSize );.. 
15ff0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
16000 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70 54   uses of pBt->pT
16010 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66 6f  mpSpace is to fo
16020 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f 72  rmat cells befor
16030 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 69  e.    ** inserti
16040 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c  ng them into a l
16050 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74 69  eaf page (functi
16060 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29  on fillInCell())
16070 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63 65  . If.    ** a ce
16080 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ll is less than 
16090 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  4 bytes in size,
160a0 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20 75   it is rounded u
160b0 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20 20  p to 4 bytes.   
160c0 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69 6f   ** by the vario
160d0 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  us routines that
160e0 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e 61   manipulate bina
160f0 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a  ry cells. Which.
16100 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20      ** can mean 
16110 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  that fillInCell(
16120 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a  ) only initializ
16130 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20 6f  es the first 2 o
16140 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  r 3.    ** bytes
16150 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20 62   of pTmpSpace, b
16160 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72 73  ut that the firs
16170 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63 6f  t 4 bytes are co
16180 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  pied from.    **
16190 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61 62   it into a datab
161a0 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20 69  ase page. This i
161b0 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61  s not actually a
161c0 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74   problem, but it
161d0 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61 75  .    ** does cau
161e0 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65 72  se a valgrind er
161f0 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20 6f  ror when the 1 o
16200 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e 69  r 2 bytes of uni
16210 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a  tialized .    **
16220 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64 20   data is passed 
16230 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 77  to system call w
16240 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61 76  rite(). So to av
16250 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c 0a  oid this error,.
16260 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20      ** zero the 
16270 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
16280 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72 65   temp space here
16290 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
162a0 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20 66  Also:  Provide f
162b0 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e 69  our bytes of ini
162c0 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 62  tialized space b
162d0 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
162e0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54   beginning of pT
162f0 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61 72  mpSpace as an ar
16300 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ea available to 
16310 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20 20  prepend the.    
16320 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f  ** left-child po
16330 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65 67  inter to the beg
16340 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c  inning of a cell
16350 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
16360 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16370 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
16380 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20  pBt->pTmpSpace, 
16390 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42 74  0, 8);.      pBt
163a0 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34  ->pTmpSpace += 4
163b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
163c0 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42  *.** Free the pB
163d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c  t->pTmpSpace all
163e0 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
163f0 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53  c void freeTempS
16400 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
16410 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e  Bt){.  if( pBt->
16420 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
16430 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16440 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74 65  -= 4;.    sqlite
16450 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e 70  3PageFree(pBt->p
16460 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
16470 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
16480 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16490 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
164a0 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
164b0 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
164c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
164d0 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
164e0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
164f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
16500 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
16510 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
16520 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
16530 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
16540 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
16550 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16560 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
16570 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
16580 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
16590 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
165a0 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
165b0 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
165c0 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
165d0 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
165e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
165f0 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
16600 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16610 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
16620 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
16630 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
16640 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
16650 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
16660 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
16670 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
16680 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
16690 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
166a0 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
166b0 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
166c0 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
166d0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
166e0 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51  eeRollback(p, SQ
166f0 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
16700 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16710 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
16720 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74  ere are still ot
16730 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  her outstanding 
16740 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
16750 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20  e shared-btree. 
16760 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72   ** structure, r
16770 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72  eturn now. The r
16780 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73  emainder of this
16790 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
167a0 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73  s .  ** up the s
167b0 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a  hared-btree..  *
167c0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  /.  assert( p->w
167d0 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20  antToLock==0 && 
167e0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
167f0 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62    if( !p->sharab
16800 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d  le || removeFrom
16810 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29  SharingList(pBt)
16820 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
16830 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  Bt is no longer 
16840 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c  on the sharing l
16850 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61  ist, so we can a
16860 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20  ccess.    ** it 
16870 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
16880 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
16890 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
168a0 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65  Clean out and de
168b0 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65  lete the BtShare
168c0 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f  d object..    */
168d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42  .    assert( !pB
168e0 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20  t->pCursor );.  
168f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
16900 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ose(pBt->pPager,
16910 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28   p->db);.    if(
16920 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
16930 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d  a && pBt->pSchem
16940 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  a ){.      pBt->
16950 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d  xFreeSchema(pBt-
16960 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
16970 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16980 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65  ee(0, pBt->pSche
16990 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
169a0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
169b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
169c0 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
169d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
169e0 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
169f0 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
16a00 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
16a10 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
16a20 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
16a30 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
16a40 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
16a50 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
16a60 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
16a70 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
16a80 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
16a90 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
16aa0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16ab0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
16ac0 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74  soft" limit on t
16ad0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
16ae0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
16af0 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75  .** Unused and u
16b00 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20  nmodified pages 
16b10 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64  will be recycled
16b20 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
16b30 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20   of.** pages in 
16b40 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64  the cache exceed
16b50 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69  s this soft limi
16b60 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65  t.  But the size
16b70 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65   of the.** cache
16b80 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67   is allowed to g
16b90 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20  row larger than 
16ba0 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74  this limit if it
16bb0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72   contains.** dir
16bc0 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65  ty pages or page
16bd0 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76  s still in activ
16be0 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e use..*/.int sq
16bf0 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63  lite3BtreeSetCac
16c00 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  heSize(Btree *p,
16c10 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
16c20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16c30 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
16c40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16c50 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
16c60 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
16c70 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16c80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
16c90 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  achesize(pBt->pP
16ca0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
16cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16cc0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16cd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16ce0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22  .** Change the "
16cf0 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20  spill" limit on 
16d00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16d10 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
16d20 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  ..** If the numb
16d30 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65  er of pages exce
16d40 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64  eds this limit d
16d50 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72  uring a write tr
16d60 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68  ansaction,.** th
16d70 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74  e pager might at
16d80 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22  tempt to "spill"
16d90 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f   pages to the jo
16da0 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a  urnal early in.*
16db0 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20  * order to free 
16dc0 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  up memory..**.**
16dd0 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
16de0 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65  ned is the curre
16df0 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20  nt spill size.  
16e00 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65  If zero is passe
16e10 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  d.** as an argum
16e20 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20  ent, no changes 
16e30 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20  are made to the 
16e40 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69  spill size setti
16e50 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20  ng, so.** using 
16e60 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61  mxPage of 0 is a
16e70 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68   way to query th
16e80 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20  e current spill 
16e90 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  size..*/.int sql
16ea0 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c  ite3BtreeSetSpil
16eb0 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  lSize(Btree *p, 
16ec0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
16ed0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16ee0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73  ->pBt;.  int res
16ef0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16f00 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16f10 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
16f20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16f30 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20  ter(p);.  res = 
16f40 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
16f50 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50  pillsize(pBt->pP
16f60 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
16f70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16f80 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16f90 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  res;.}..#if SQLI
16fa0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
16fb0 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  >0./*.** Change 
16fc0 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  the limit on the
16fd0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64   amount of the d
16fe0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
16ff0 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f  t may be.** memo
17000 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e  ry mapped..*/.in
17010 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17020 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65  tMmapLimit(Btree
17030 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74   *p, sqlite3_int
17040 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74  64 szMmap){.  Bt
17050 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
17060 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
17070 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
17080 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
17090 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
170a0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
170b0 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
170c0 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
170d0 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73  er, szMmap);.  s
170e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
170f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
17100 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
17110 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
17120 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
17130 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17140 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
17150 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
17160 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
17170 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
17180 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
17190 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
171a0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
171b0 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
171c0 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
171d0 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
171e0 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
171f0 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
17200 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
17210 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
17220 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
17230 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
17240 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
17250 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
17260 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
17270 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
17280 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
17290 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
172a0 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
172b0 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
172c0 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
172d0 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
172e0 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
172f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17300 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
17310 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17320 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20  SetPagerFlags(. 
17330 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
17340 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
17350 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20  tree to set the 
17360 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20  safety level on 
17370 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67  */.  unsigned pg
17380 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56  Flags       /* V
17390 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66  arious PAGER_* f
173a0 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  lags */.){.  BtS
173b0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
173c0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
173d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
173e0 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
173f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17400 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
17410 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
17420 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  s(pBt->pPager, p
17430 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74  gFlags);.  sqlit
17440 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17450 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17460 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
17470 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
17480 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
17490 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
174a0 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
174b0 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
174c0 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65   Or, if the page
174d0 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64   size has alread
174e0 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65  y been fixed, re
174f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17500 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74  ONLY .** without
17510 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69   changing anythi
17520 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ng..**.** The pa
17530 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
17540 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
17550 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
17560 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
17570 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
17580 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
17590 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
175a0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
175b0 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
175c0 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
175d0 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
175e0 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
175f0 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
17600 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
17610 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
17620 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
17630 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
17640 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
17650 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
17660 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
17670 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
17680 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
17690 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
176a0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
176b0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
176c0 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
176d0 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
176e0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
176f0 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
17700 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
17710 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
17720 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  anged..**.** If 
17730 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e  the iFix!=0 then
17740 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49 5a   the BTS_PAGESIZ
17750 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73 20  E_FIXED flag is 
17760 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
17770 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
17780 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
17790 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
177a0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
177b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
177c0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
177d0 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
177e0 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
177f0 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
17800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17810 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17820 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17830 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
17840 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
17850 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
17860 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69  treeEnter(p);.#i
17870 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17880 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76  EC.  if( nReserv
17890 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  e>pBt->optimalRe
178a0 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70 74  serve ) pBt->opt
178b0 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28 75  imalReserve = (u
178c0 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  8)nReserve;.#end
178d0 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74  if.  if( pBt->bt
178e0 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47  sFlags & BTS_PAG
178f0 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20  ESIZE_FIXED ){. 
17900 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
17910 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74  eave(p);.    ret
17920 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
17930 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  NLY;.  }.  if( n
17940 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20  Reserve<0 ){.   
17950 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d   nReserve = pBt-
17960 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
17970 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d  >usableSize;.  }
17980 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65  .  assert( nRese
17990 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72  rve>=0 && nReser
179a0 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28  ve<=255 );.  if(
179b0 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26   pageSize>=512 &
179c0 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49  & pageSize<=SQLI
179d0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
179e0 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61   &&.        ((pa
179f0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
17a00 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  ze)==0 ){.    as
17a10 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
17a20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 7)==0 );.    a
17a30 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
17a40 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d  rsor );.    pBt-
17a50 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33 32  >pageSize = (u32
17a60 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66  )pageSize;.    f
17a70 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
17a80 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
17a90 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
17aa0 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
17ab0 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
17ac0 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20  e, nReserve);.  
17ad0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
17ae0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
17af0 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65 3b  - (u16)nReserve;
17b00 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70 42  .  if( iFix ) pB
17b10 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
17b20 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
17b30 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  D;.  sqlite3Btre
17b40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17b50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17b60 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
17b70 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
17b80 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
17b90 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
17ba0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
17bb0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
17bc0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
17bd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
17be0 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ion is similar t
17bf0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
17c00 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63 65  tReserve(), exce
17c10 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61  pt that it.** ma
17c20 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64  y only be called
17c30 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61 6e   if it is guaran
17c40 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62 2d  teed that the b-
17c50 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61 6c  tree mutex is al
17c60 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a  ready.** held..*
17c70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73 65  *.** This is use
17c80 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63 69  ful in one speci
17c90 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20 62  al case in the b
17ca0 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20 77  ackup API code w
17cb0 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e  here it is.** kn
17cc0 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68 61  own that the sha
17cd0 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65 78  red b-tree mutex
17ce0 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74 68   is held, but th
17cf0 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 0a  e mutex on the .
17d00 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
17d10 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 20  le that owns *p 
17d20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20  is not. In this 
17d30 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33 42  case if sqlite3B
17d40 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77  treeEnter().** w
17d50 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65 64  ere to be called
17d60 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69  , it might colli
17d70 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74 68  de with some oth
17d80 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20  er operation on 
17d90 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
17da0 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73  handle that owns
17db0 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e 64   *p, causing und
17dc0 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72 2e  efined behavior.
17dd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
17de0 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
17df0 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29 7b  Mutex(Btree *p){
17e00 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65  .  int n;.  asse
17e10 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
17e20 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
17e30 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70  utex) );.  n = p
17e40 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
17e50 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
17e60 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e  Size;.  return n
17e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
17e80 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17e90 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
17ea0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
17eb0 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
17ec0 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
17ed0 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
17ee0 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
17ef0 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
17f00 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
17f10 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
17f20 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  ns..**.** If SQL
17f30 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69 73  ITE_HAS_MUTEX is
17f40 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74 68   defined then th
17f50 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
17f60 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65 61  d is the.** grea
17f70 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72 65  ter of the curre
17f80 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61 63  nt reserved spac
17f90 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d 75  e and the maximu
17fa0 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 72  m requested.** r
17fb0 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f  eserve space..*/
17fc0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17fd0 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65 72  eGetOptimalReser
17fe0 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
17ff0 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
18000 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18010 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65   n = sqlite3Btre
18020 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
18030 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53 51  ex(p);.#ifdef SQ
18040 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
18050 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f   if( n<p->pBt->o
18060 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
18070 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  n = p->pBt->opti
18080 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e 64  malReserve;.#end
18090 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  if.  sqlite3Btre
180a0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
180b0 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
180c0 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
180d0 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
180e0 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
180f0 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
18100 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
18110 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
18120 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
18130 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
18140 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
18150 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
18160 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
18170 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
18180 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
18190 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
181a0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
181b0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
181c0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
181d0 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
181e0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
181f0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
18200 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
18210 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18220 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
18230 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
18240 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  e values for the
18250 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18260 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  TE and BTS_OVERW
18270 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  RITE flags:.**.*
18280 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20  *    newFlag==0 
18290 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f 53        Both BTS_S
182a0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
182b0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 61   BTS_OVERWRITE a
182c0 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20  re cleared.**   
182d0 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20 20   newFlag==1     
182e0 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c    BTS_SECURE_DEL
182f0 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53 5f  ETE set and BTS_
18300 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c 65  OVERWRITE is cle
18310 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
18320 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53 5f  ag==2       BTS_
18330 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6c  SECURE_DELETE cl
18340 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f 56  eared and BTS_OV
18350 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a 2a  ERWRITE is set.*
18360 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d  *    newFlag==(-
18370 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65 73  1)    No changes
18380 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18390 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71 75  ine acts as a qu
183a0 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20 69  ery if newFlag i
183b0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
183c0 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f  .**.** With BTS_
183d0 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20 64  OVERWRITE set, d
183e0 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
183f0 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62 79  s overwritten by
18400 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66   zeros, but.** f
18410 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67  reelist leaf pag
18420 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74 74  es are not writt
18430 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  en back to the d
18440 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20 69  atabase.  Thus i
18450 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65  n-page.** delete
18460 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65  d content is cle
18470 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c 69  ared, but freeli
18480 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65  st deleted conte
18490 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  nt is not..**.**
184a0 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52 45   With BTS_SECURE
184b0 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74 69  _DELETE, operati
184c0 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f  on is like BTS_O
184d0 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74 68  VERWRITE with th
184e0 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68  e addition.** th
184f0 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66  at freelist leaf
18500 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74 74   pages are writt
18510 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
18520 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72 65   database, incre
18530 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f  asing.** the amo
18540 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e  unt of disk I/O.
18550 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18560 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74 65  treeSecureDelete
18570 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
18580 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62  ewFlag){.  int b
18590 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
185a0 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74  eturn 0;.  sqlit
185b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
185c0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 4f  .  assert( BTS_O
185d0 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53 45  VERWRITE==BTS_SE
185e0 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b  CURE_DELETE*2 );
185f0 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f 46  .  assert( BTS_F
18600 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54 53  AST_SECURE==(BTS
18610 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f 53  _OVERWRITE|BTS_S
18620 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29 3b  ECURE_DELETE) );
18630 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d  .  if( newFlag>=
18640 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d  0 ){.    p->pBt-
18650 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
18660 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a 20  S_FAST_SECURE;. 
18670 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
18680 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
18690 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67  E_DELETE*newFlag
186a0 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e  ;.  }.  b = (p->
186b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
186c0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 29  BTS_FAST_SECURE)
186d0 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45  /BTS_SECURE_DELE
186e0 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  TE;.  sqlite3Btr
186f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18700 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn b;.}../*.**
18710 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
18720 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
18730 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
18740 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
18750 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
18760 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
18770 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
18780 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
18790 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
187a0 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
187b0 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
187c0 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
187d0 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
187e0 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
187f0 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
18800 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
18810 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
18820 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
18830 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
18840 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
18850 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
18860 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18870 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
18880 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
18890 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
188a0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
188b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
188c0 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
188d0 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
188e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
188f0 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74  r(p);.  if( (pBt
18900 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
18910 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29  _PAGESIZE_FIXED)
18920 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29  !=0 && (av ?1:0)
18930 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  !=pBt->autoVacuu
18940 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
18950 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
18960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
18970 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76  >autoVacuum = av
18980 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e   ?1:0;.    pBt->
18990 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d  incrVacuum = av=
189a0 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73  =2 ?1:0;.  }.  s
189b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
189c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
189d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
189e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
189f0 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d  ue of the 'auto-
18a00 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
18a10 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d  . If auto-vacuum
18a20 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20   is .** enabled 
18a30 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  1 is returned. O
18a40 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69  therwise 0..*/.i
18a50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
18a60 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
18a70 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53  ee *p){.#ifdef S
18a80 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
18a90 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42  ACUUM.  return B
18aa0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18ab0 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e  NONE;.#else.  in
18ac0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
18ad0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18ae0 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e  rc = (.    (!p->
18af0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
18b00 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
18b10 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d  M_NONE:.    (!p-
18b20 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d  >pBt->incrVacuum
18b30 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
18b40 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52  UM_FULL:.    BTR
18b50 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e  EE_AUTOVACUUM_IN
18b60 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65  CR.  );.  sqlite
18b70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18b80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
18b90 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  dif.}../*.** If 
18ba0 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f 74  the user has not
18bb0 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79 2d   set the safety-
18bc0 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20 64  level for this d
18bd0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
18be0 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52 41  on.** using "PRA
18bf0 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22  GMA synchronous"
18c00 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61 66  , and if the saf
18c10 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74  ety-level is not
18c20 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
18c30 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  to the value pas
18c40 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
18c50 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63 6f  tion as the seco
18c60 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a  nd parameter,.**
18c70 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23   set it so..*/.#
18c80 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
18c90 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53  T_SYNCHRONOUS!=S
18ca0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
18cb0 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a  L_SYNCHRONOUS \.
18cc0 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28      && !defined(
18cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
18ce0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
18cf0 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28  DefaultSyncFlag(
18d00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 75  BtShared *pBt, u
18d10 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b  8 safety_level){
18d20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
18d30 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66 28    Db *pDb;.  if(
18d40 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30   (db=pBt->db)!=0
18d50 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44 62   && (pDb=db->aDb
18d60 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  )!=0 ){.    whil
18d70 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c  e( pDb->pBt==0 |
18d80 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21  | pDb->pBt->pBt!
18d90 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d  =pBt ){ pDb++; }
18da0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53  .    if( pDb->bS
18db0 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20 20  yncSet==0 .     
18dc0 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c  && pDb->safety_l
18dd0 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76  evel!=safety_lev
18de0 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62 21  el .     && pDb!
18df0 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20  =&db->aDb[1] .  
18e00 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e    ){.      pDb->
18e10 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73  safety_level = s
18e20 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20  afety_level;.   
18e30 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
18e40 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
18e50 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 70  ger,.          p
18e60 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
18e70 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   | (db->flags & 
18e80 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b  PAGER_FLAGS_MASK
18e90 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ));.    }.  }.}.
18ea0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
18eb0 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61  etDefaultSyncFla
18ec0 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65 76  g(pBt,safety_lev
18ed0 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46  el).#endif../* F
18ee0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
18ef0 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
18f00 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
18f10 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a  hared*);.../*.**
18f20 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
18f30 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
18f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18f50 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
18f60 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
18f70 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
18f80 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
18f90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
18fa0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
18fb0 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
18fc0 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
18fd0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
18fe0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
18ff0 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
19000 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
19010 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19020 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
19030 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
19040 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
19050 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
19060 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
19070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
19080 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
19090 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
190a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
190b0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
190c0 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
190d0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
190e0 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
190f0 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
19100 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
19110 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
19120 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19130 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
19140 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
19150 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
19160 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
19170 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
19180 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
19190 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
191a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
191b0 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
191c0 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
191d0 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
191e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
191f0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
19200 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
19210 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
19220 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
19230 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
19240 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
19250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19260 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19270 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
19280 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
19290 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
192a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
192b0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
192c0 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
192d0 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
192e0 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
192f0 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
19300 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
19310 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
19320 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
19330 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
19340 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
19350 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
19360 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
19370 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
19380 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
19390 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
193a0 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
193b0 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
193c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
193d0 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
193e0 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
193f0 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62  }.  if( (pBt->db
19400 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
19410 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29 21  _ResetDatabase)!
19420 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
19430 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
19440 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
19450 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
19460 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
19470 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
19480 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
19490 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
194a0 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
194b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
194c0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
194d0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
194e0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
194f0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
19500 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
19510 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
19520 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
19530 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
19540 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
19550 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
19560 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
19570 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
19580 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
19590 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
195a0 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
195b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
195c0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
195d0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
195e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
195f0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
19600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
19610 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
19620 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19630 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19640 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
19650 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
19660 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
19670 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
19680 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
19690 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
196a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
196b0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
196c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
196d0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
196e0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
196f0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
19700 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
19710 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
19720 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
19730 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
19740 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
19750 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
19760 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
19770 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
19780 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
19790 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
197a0 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
197b0 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
197c0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
197d0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
197e0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
197f0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
19800 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
19810 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
19820 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
19830 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
19840 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
19850 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
19860 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
19870 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
19880 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
19890 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
198a0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
198b0 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
198c0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
198d0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
198e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
198f0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
19900 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
19910 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19930 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
19940 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
19950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19960 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
19970 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
19980 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
19990 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
199a0 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
199b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
199c0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
199d0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
199e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
199f0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
19a00 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
19a10 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
19a20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19a30 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
19a40 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
19a50 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
19a60 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  US+1);.    }.#en
19a70 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
19a80 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
19a90 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
19aa0 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
19ab0 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
19ac0 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
19ad0 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
19ae0 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
19af0 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
19b00 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
19b10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
19b20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
19b30 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
19b40 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
19b50 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
19b60 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
19b70 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
19b80 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
19b90 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
19ba0 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
19bb0 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
19bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
19bd0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
19be0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
19bf0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19c00 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
19c10 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
19c20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
19c30 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
19c40 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
19c50 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
19c60 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
19c70 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
19c80 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
19c90 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
19ca0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
19cb0 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
19cc0 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
19cd0 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
19ce0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19cf0 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
19d00 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
19d10 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
19d20 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
19d30 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
19d40 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
19d50 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
19d60 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
19d70 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
19d80 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
19d90 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
19da0 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
19db0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
19dc0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
19dd0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
19de0 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
19df0 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
19e00 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19e10 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54   R-59310-51205 T
19e20 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70 61  he "reserved spa
19e30 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20  ce" size in the 
19e40 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e  1-byte.    ** in
19e50 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
19e60 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  20 is the number
19e70 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
19e80 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
19e90 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67  .    ** each pag
19ea0 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72  e to reserve for
19eb0 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20   extensions. .  
19ec0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44    **.    ** EVID
19ed0 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37  ENCE-OF: R-37497
19ee0 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65 20  -42412 The size 
19ef0 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64 20  of the reserved 
19f00 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a  region is.    **
19f10 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
19f20 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69  he one-byte unsi
19f30 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75  gned integer fou
19f40 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  nd at an offset 
19f50 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74  of 20.    ** int
19f60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
19f70 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  ile header. */. 
19f80 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
19f90 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31  pageSize - page1
19fa0 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75  [20];.    if( (u
19fb0 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74  32)pageSize!=pBt
19fc0 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
19fd0 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61      /* After rea
19fe0 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  ding the first p
19ff0 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1a000 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70  ase assuming a p
1a010 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a  age size.      *
1a020 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61  * of BtShared.pa
1a030 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20  geSize, we have 
1a040 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
1a050 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73  the page-size is
1a060 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c  .      ** actual
1a070 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c  ly pageSize. Unl
1a080 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
1a090 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  , leave pBt->pPa
1a0a0 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20  ge1 at.      ** 
1a0b0 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  zero and return 
1a0c0 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63  SQLITE_OK. The c
1a0d0 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20  aller will call 
1a0e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
1a0f0 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74      ** again wit
1a100 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61  h the correct pa
1a110 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a  ge-size..      *
1a120 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  /.      releaseP
1a130 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1a140 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
1a150 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1a160 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  ze;.      pBt->p
1a170 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1a180 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65  ze;.      freeTe
1a190 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
1a1a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a1b0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
1a1c0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
1a1d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  Bt->pageSize,.  
1a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65   pageSize-usable
1a210 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Size);.      ret
1a220 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1a230 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e    if( (pBt->db->
1a240 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
1a250 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 20 26  riteSchema)==0 &
1a260 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
1a270 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
1a280 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1a290 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1a2a0 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
1a2b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
1a2c0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1a2d0 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76  8312-64704 Howev
1a2e0 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73  er, the usable s
1a2f0 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ize is not allow
1a300 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
1a310 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49  less than 480. I
1a320 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
1a330 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
1a340 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65  is 512, then the
1a350 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64  .    ** reserved
1a360 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e   space size cann
1a370 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f  ot exceed 32. */
1a380 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
1a390 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
1a3a0 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a3b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1a3c0 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
1a3d0 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
1a3e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a3f0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
1a400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a410 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1a420 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
1a430 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
1a440 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
1a450 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
1a460 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
1a470 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
1a480 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
1a490 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
1a4a0 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
1a4b0 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
1a4c0 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
1a4d0 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
1a4e0 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
1a4f0 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
1a500 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
1a510 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
1a520 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
1a530 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
1a540 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
1a550 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
1a560 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
1a570 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
1a580 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
1a590 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
1a5a0 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
1a5b0 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
1a5c0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
1a5d0 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
1a5e0 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
1a5f0 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
1a600 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
1a610 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
1a620 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
1a630 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
1a640 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
1a650 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
1a660 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
1a670 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
1a680 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
1a690 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
1a6a0 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
1a6b0 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
1a6c0 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
1a6d0 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
1a6e0 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
1a6f0 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
1a700 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1a710 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
1a720 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
1a730 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
1a740 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1a750 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
1a760 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
1a770 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
1a780 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
1a790 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
1a7a0 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
1a7b0 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
1a7c0 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
1a7d0 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
1a7e0 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1a7f0 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
1a800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
1a810 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
1a820 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
1a830 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
1a840 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
1a850 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
1a860 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
1a870 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1a880 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
1a890 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
1a8a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a8b0 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
1a8c0 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
1a8d0 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1a8e0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
1a8f0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1a900 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
1a910 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  G./*.** Return t
1a920 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
1a930 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74  sors open on pBt
1a940 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
1a950 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
1a960 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
1a970 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
1a980 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
1a990 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
1a9a0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ..**.** Only wri
1a9b0 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  te cursors are c
1a9c0 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79  ounted if wrOnly
1a9d0 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72   is true.  If wr
1a9e0 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65  Only is.** false
1a9f0 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72   then all cursor
1aa00 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a  s are counted..*
1aa10 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
1aa20 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f  poses of this ro
1aa30 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20  utine, a cursor 
1aa40 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
1aa50 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
1aa60 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77   of reading or w
1aa70 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
1aa80 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73  tabase.  Cursors
1aa90 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65   that.** have be
1aaa0 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20  en tripped into 
1aab0 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  the CURSOR_FAULT
1aac0 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63   state are not c
1aad0 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ounted..*/.stati
1aae0 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64  c int countValid
1aaf0 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
1ab00 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c   *pBt, int wrOnl
1ab10 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  y){.  BtCursor *
1ab20 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
1ab30 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
1ab40 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
1ab50 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
1ab60 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72  xt){.    if( (wr
1ab70 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Only==0 || (pCur
1ab80 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
1ab90 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29  F_WriteFlag)!=0)
1aba0 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65  .     && pCur->e
1abb0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41  State!=CURSOR_FA
1abc0 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a  ULT ) r++; .  }.
1abd0 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65    return r;.}.#e
1abe0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  ndif../*.** If t
1abf0 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
1ac00 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
1ac10 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
1ac20 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
1ac30 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1ac40 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
1ac50 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
1ac60 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
1ac70 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
1ac80 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
1ac90 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1aca0 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
1acb0 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
1acc0 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
1acd0 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
1ace0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
1acf0 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1ad00 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
1ad10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1ad20 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1ad30 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
1ad40 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
1ad50 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
1ad60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ad70 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1ad80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  ) );.  assert( c
1ad90 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
1ada0 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42  (pBt,0)==0 || pB
1adb0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1adc0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
1add0 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
1ade0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
1adf0 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67  ONE && pBt->pPag
1ae00 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d  e1!=0 ){.    Mem
1ae10 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
1ae20 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20  Bt->pPage1;.    
1ae30 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e  assert( pPage1->
1ae40 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
1ae50 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1ae60 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
1ae70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20  Pager)==1 );.   
1ae80 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
1ae90 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1aea0 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1aeb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
1aec0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
1aed0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
1aee0 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
1aef0 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
1af00 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
1af10 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
1af20 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
1af30 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
1af40 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1af50 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
1af60 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1af70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
1af80 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1af90 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
1afa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1afb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1afc0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1afd0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
1afe0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1aff0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1b000 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
1b010 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
1b020 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
1b030 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
1b040 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b050 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
1b060 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
1b070 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
1b080 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
1b090 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
1b0a0 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
1b0b0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1b0c0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
1b0d0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
1b0e0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
1b0f0 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
1b100 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
1b110 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
1b120 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
1b130 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
1b140 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
1b150 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
1b160 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
1b170 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
1b180 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
1b190 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
1b1a0 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
1b1b0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
1b1c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1b1d0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
1b1e0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
1b1f0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
1b200 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
1b210 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
1b220 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
1b230 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
1b240 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
1b250 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
1b260 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1b270 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
1b280 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b290 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1b2a0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
1b2b0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
1b2c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
1b2d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b2e0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
1b2f0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
1b300 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
1b310 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1b320 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
1b330 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
1b340 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1b350 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
1b360 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
1b370 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
1b380 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
1b390 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1b3a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
1b3b0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
1b3c0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1b3d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
1b3e0 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
1b3f0 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
1b400 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
1b410 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
1b420 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
1b430 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
1b440 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
1b450 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1b460 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1b470 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1b480 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
1b490 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1b4a0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1b4b0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
1b4c0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
1b4d0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
1b4e0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
1b4f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1b500 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b510 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1b520 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
1b530 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
1b540 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
1b550 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
1b560 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1b570 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
1b580 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
1b590 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
1b5a0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1b5b0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
1b5c0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
1b5d0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1b5e0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
1b5f0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
1b600 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
1b610 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
1b620 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
1b630 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
1b640 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
1b650 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
1b660 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
1b670 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
1b680 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
1b690 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
1b6a0 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
1b6b0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
1b6c0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1b6d0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
1b6e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1b6f0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
1b700 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
1b710 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
1b720 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1b730 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
1b740 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
1b750 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
1b760 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
1b770 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
1b780 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
1b790 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1b7a0 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
1b7b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1b7c0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
1b7d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1b7e0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
1b7f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b800 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
1b810 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1b820 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
1b830 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
1b840 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
1b850 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
1b860 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
1b870 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
1b880 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
1b890 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
1b8a0 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
1b8b0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
1b8c0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
1b8d0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
1b8e0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
1b8f0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1b900 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1b910 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1b920 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1b930 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1b940 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1b950 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1b960 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1b970 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1b980 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1b990 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1b9a0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1b9b0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1b9c0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1b9d0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1b9e0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1b9f0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1ba00 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1ba10 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1ba20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1ba30 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1ba40 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1ba50 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1ba60 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1ba70 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1ba80 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1ba90 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1baa0 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1bab0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1bac0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1bad0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1bae0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1baf0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1bb00 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1bb10 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1bb20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1bb30 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1bb40 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1bb50 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1bb60 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1bb70 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1bb80 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1bb90 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1bba0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1bbb0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1bbc0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1bbd0 72 66 6c 61 67 2c 20 69 6e 74 20 2a 70 53 63 68  rflag, int *pSch
1bbe0 65 6d 61 56 65 72 73 69 6f 6e 29 7b 0a 20 20 42  emaVersion){.  B
1bbf0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1bc00 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1bc10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1bc20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1bc30 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1bc40 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1bc50 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
1bc60 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
1bc70 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
1bc80 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
1bc90 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
1bca0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
1bcb0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1bcc0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
1bcd0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
1bce0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1bcf0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1bd00 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
1bd10 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1bd20 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
1bd30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
1bd40 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
1bd50 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1bd60 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1bd70 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
1bd80 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
1bd90 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
1bda0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
1bdb0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
1bdc0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
1bdd0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
1bde0 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
1bdf0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1be00 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
1be10 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
1be20 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1be30 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
1be40 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
1be50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1be60 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1be70 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
1be80 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
1be90 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
1bea0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1beb0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
1bec0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
1bed0 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f  action .    ** o
1bee0 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
1bef0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
1bf00 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
1bf10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
1bf20 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64      ** requested
1bf30 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1bf40 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20  LOCKED..    */. 
1bf50 20 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26     if( (wrflag &
1bf60 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1bf70 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1bf80 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d  E).     || (pBt-
1bf90 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1bfa0 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20  PENDING)!=0.    
1bfb0 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  ){.      pBlock 
1bfc0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
1bfd0 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  db;.    }else if
1bfe0 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
1bff0 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
1c000 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74  r;.      for(pIt
1c010 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
1c020 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
1c030 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
1c040 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
1c050 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
1c060 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
1c070 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
1c080 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1c090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c0a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1c0b0 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
1c0c0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
1c0d0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
1c0e0 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  , pBlock);.     
1c0f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
1c100 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
1c110 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  .      goto tran
1c120 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20  s_begun;.    }. 
1c130 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1c140 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
1c150 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
1c160 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
1c170 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
1c180 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
1c190 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
1c1a0 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
1c1b0 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
1c1c0 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
1c1d0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
1c1e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
1c1f0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
1c200 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
1c210 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1c220 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
1c230 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
1c240 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1c250 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
1c260 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
1c270 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
1c280 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1c290 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1c2a0 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
1c2b0 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
1c2c0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
1c2d0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
1c2e0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
1c2f0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
1c300 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
1c310 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
1c320 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
1c330 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
1c340 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
1c350 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
1c360 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
1c370 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1c380 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
1c390 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
1c3a0 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
1c3b0 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
1c3c0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
1c3d0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1c3e0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
1c3f0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
1c400 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
1c410 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
1c420 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
1c430 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
1c440 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
1c450 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
1c460 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
1c470 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
1c480 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
1c490 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
1c4a0 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
1c4b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c4c0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1c4d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
1c4e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1c4f0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1c500 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c510 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1c520 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c530 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c540 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
1c550 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
1c560 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
1c570 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
1c580 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1c590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c5a0 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
1c5b0 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1c5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c5d0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1c5e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c5f0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
1c600 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1c610 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
1c620 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
1c630 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
1c640 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1c650 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
1c660 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
1c670 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
1c680 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  Bt) );.  sqlite3
1c690 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69  PagerResetLockTi
1c6a0 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61 67 65  meout(pBt->pPage
1c6b0 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  r);..  if( rc==S
1c6c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c6d0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1c6e0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
1c6f0 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
1c700 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66  ction++;.#ifndef
1c710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1c720 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1c730 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
1c740 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1c750 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  t( p->lock.pBtre
1c760 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e  e==p && p->lock.
1c770 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20  iTable==1 );.   
1c780 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f       p->lock.eLo
1c790 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
1c7a0 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1c7b0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
1c7c0 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  ck;.        pBt-
1c7d0 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63  >pLock = &p->loc
1c7e0 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  k;.      }.#endi
1c7f0 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  f.    }.    p->i
1c800 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
1c810 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
1c820 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
1c830 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
1c840 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1c850 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
1c860 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
1c870 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
1c880 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29      if( wrflag )
1c890 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
1c8a0 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1c8b0 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53  Page1;.#ifndef S
1c8c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1c8d0 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73  D_CACHE.      as
1c8e0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
1c8f0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
1c900 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
1c910 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
1c920 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55  gs &= ~BTS_EXCLU
1c930 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIVE;.      if( 
1c940 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e  wrflag>1 ) pBt->
1c950 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1c960 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69  EXCLUSIVE;.#endi
1c970 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  f..      /* If t
1c980 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65  he db-size heade
1c990 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72  r field is incor
1c9a0 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20  rect (as it may 
1c9b0 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20  be if an old.   
1c9c0 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73     ** client has
1c9d0 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68   been writing th
1c9e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  e database file)
1c9f0 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e  , update it now.
1ca00 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20   Doing.      ** 
1ca10 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68  this sooner rath
1ca20 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65  er than later me
1ca30 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
1ca40 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79   size can safely
1ca50 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65   .      ** re-re
1ca60 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
1ca70 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31  size from page 1
1ca80 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   if a savepoint 
1ca90 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  or transaction. 
1caa0 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b       ** rollback
1cab0 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
1cac0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
1cad0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1cae0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67  f( pBt->nPage!=g
1caf0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1cb00 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20  >aData[28]) ){. 
1cb10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1cb20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1cb30 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1cb40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1cb50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cb60 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1cb70 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1cb80 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1cb90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cba0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 74   }.    }.  }...t
1cbb0 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66  rans_begun:.  if
1cbc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cbd0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68 65  ){.    if( pSche
1cbe0 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20  maVersion ){.   
1cbf0 20 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69     *pSchemaVersi
1cc00 6f 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  on = get4byte(&p
1cc10 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1cc20 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  a[40]);.    }.  
1cc30 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
1cc40 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1cc50 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68  ll makes sure th
1cc60 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73  at the pager has
1cc70 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
1cc80 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ber of.      ** 
1cc90 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
1cca0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70   If the second p
1ccb0 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61  arameter is grea
1ccc0 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20  ter than 0 and. 
1ccd0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d       ** the sub-
1cce0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1ccf0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1cd00 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1cd10 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ned here..      
1cd20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1cd30 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
1cd40 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
1cd50 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  ger, p->db->nSav
1cd60 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
1cd70 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1cd80 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
1cd90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1cda0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cdb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1cdc0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1cdd0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
1cde0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
1cdf0 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
1ce00 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
1ce10 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
1ce20 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
1ce30 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
1ce40 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1ce50 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
1ce60 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
1ce70 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
1ce80 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
1ce90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1cea0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
1ceb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1cec0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cee0 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
1cef0 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
1cf00 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
1cf30 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
1cf40 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1cf70 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
1cf80 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1cf90 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f  age->pBt;.  Pgno
1cfa0 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
1cfb0 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
1cfc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1cfd0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1cfe0 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
1cff0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20  pPage->isInit ? 
1d000 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65  SQLITE_OK : btre
1d010 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1d020 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1d030 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1d040 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  c;.  nCell = pPa
1d050 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f  ge->nCell;..  fo
1d060 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1d070 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
1d080 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1d090 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70  Page, i);..    p
1d0a0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
1d0b0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72  pPage, pCell, &r
1d0c0 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50  c);..    if( !pP
1d0d0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1d0e0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1d0f0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
1d100 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  ll);.      ptrma
1d110 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1d120 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1d130 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1d140 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d150 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1d160 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
1d170 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1d180 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d190 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1d1a0 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28  ;.    ptrmapPut(
1d1b0 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
1d1c0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
1d1d0 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20  no, &rc);.  }.. 
1d1e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d1f0 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f  *.** Somewhere o
1d200 6e 20 70 50 61 67 65 20 69 73 20 61 20 70 6f 69  n pPage is a poi
1d210 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
1d220 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73  om.  Modify this
1d230 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74   pointer so.** t
1d240 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
1d250 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20   iTo. Parameter 
1d260 65 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20  eType describes 
1d270 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e  the type of poin
1d280 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64  ter to.** be mod
1d290 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f  ified, as  follo
1d2a0 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ws:.**.** PTRMAP
1d2b0 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67  _BTREE:     pPag
1d2c0 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1d2d0 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1d2e0 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64  oints at a child
1d2f0 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20   .**            
1d300 20 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70         page of p
1d310 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1d320 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50  AP_OVERFLOW1: pP
1d330 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1d340 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1d350 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76   points at an ov
1d360 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20  erflow.**       
1d370 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1d380 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f   pointed to by o
1d390 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20  ne of the cells 
1d3a0 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  on pPage..**.** 
1d3b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1d3c0 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76  : pPage is an ov
1d3d0 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65  erflow-page. The
1d3e0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1d3f0 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20  at the next.**  
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1d420 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  n the list..*/.s
1d430 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79  tatic int modify
1d440 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50  PagePointer(MemP
1d450 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f  age *pPage, Pgno
1d460 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f   iFrom, Pgno iTo
1d470 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61  , u8 eType){.  a
1d480 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d490 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1d4a0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1d4b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d4c0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
1d4d0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1d4e0 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65  ) );.  if( eType
1d4f0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1d500 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  W2 ){.    /* The
1d510 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61   pointer is alwa
1d520 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62  ys the first 4 b
1d530 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65  ytes of the page
1d540 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
1d550 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62  */.    if( get4b
1d560 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1d570 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1d580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d590 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
1d5a0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ge);.    }.    p
1d5b0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
1d5c0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
1d5d0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
1d5e0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
1d5f0 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
1d600 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  rc = pPage->isIn
1d610 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  it ? SQLITE_OK :
1d620 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1d630 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1d640 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1d650 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65     nCell = pPage
1d660 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f  ->nCell;..    fo
1d670 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
1d680 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  i++){.      u8 *
1d690 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1d6a0 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
1d6b0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1d6c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b  MAP_OVERFLOW1 ){
1d6d0 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66  .        CellInf
1d6e0 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20  o info;.        
1d6f0 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
1d700 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
1d710 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  &info);.        
1d720 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c  if( info.nLocal<
1d730 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b  info.nPayload ){
1d740 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1d750 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cell+info.nSize 
1d760 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  > pPage->aData+p
1d770 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
1d780 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
1d790 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d7a0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
1d7b0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1d7c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1d7d0 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
1d7e0 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1d7f0 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20  ze-4) ){.       
1d800 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1d810 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1d820 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1d830 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1d850 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d860 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
1d870 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
1d880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
1d890 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
1d8a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
1d8b0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1d8c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1d8d0 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
1d8e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
1d8f0 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
1d900 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
1d910 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1d920 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1d930 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
1d940 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
1d950 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1d960 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
1d970 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1d980 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1d990 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1d9a0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
1d9b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1d9c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d9d0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
1d9e0 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
1d9f0 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
1da00 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
1da10 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
1da20 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
1da30 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
1da40 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a  mains valid..**.
1da50 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20  ** The isCommit 
1da60 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20 74  flag indicates t
1da70 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
1da80 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72  need to remember
1da90 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75   that.** the jou
1daa0 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
1dab0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
1dac0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1dad0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a  DbPage->pgno .**
1dae0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
1daf0 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68  to. The caller h
1db00 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69  as already promi
1db10 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65  sed not to write
1db20 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65   to that.** page
1db30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1db40 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
1db50 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
1db60 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
1db70 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
1db80 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
1db90 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
1dba0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
1dbb0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
1dbc0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1dbd0 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
1dbe0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
1dbf0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
1dc00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1dc10 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
1dc20 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1dc30 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
1dc40 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
1dc50 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
1dc60 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
1dc70 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
1dc80 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20  Commit          
1dc90 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66     /* isCommit f
1dca0 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73 71  lag passed to sq
1dcb0 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1dcc0 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61  ge */.){.  MemPa
1dcd0 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20  ge *pPtrPage;   
1dce0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
1dcf0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
1dd00 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a  ter to pDbPage *
1dd10 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65  /.  Pgno iDbPage
1dd20 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f   = pDbPage->pgno
1dd30 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1dd40 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1dd50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1dd60 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52  sert( eType==PTR
1dd70 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c  MAP_OVERFLOW2 ||
1dd80 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1dd90 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20  VERFLOW1 || .   
1dda0 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50     eType==PTRMAP
1ddb0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
1ddc0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1ddd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1dde0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ddf0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1de00 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61 67    assert( pDbPag
1de10 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a  e->pBt==pBt );..
1de20 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69    /* Move page i
1de30 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20  DbPage from its 
1de40 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
1de50 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20   to page number 
1de60 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54  iFreePage */.  T
1de70 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55 55  RACE(("AUTOVACUU
1de80 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20  M: Moving %d to 
1de90 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70 74  free page %d (pt
1dea0 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20 25  r page %d type %
1deb0 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44  d)\n", .      iD
1dec0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1ded0 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79 70  , iPtrPage, eTyp
1dee0 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  e));.  rc = sqli
1def0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1df00 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67 65  (pPager, pDbPage
1df10 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65 65  ->pDbPage, iFree
1df20 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b  Page, isCommit);
1df30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1df40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1df50 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62  rn rc;.  }.  pDb
1df60 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72  Page->pgno = iFr
1df70 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66  eePage;..  /* If
1df80 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20 62   pDbPage was a b
1df90 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20  tree-page, then 
1dfa0 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c  it may have chil
1dfb0 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63  d pages and/or c
1dfc0 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70  ells.  ** that p
1dfd0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
1dfe0 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e   pages. The poin
1dff0 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
1e000 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20  for all these.  
1e010 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f  ** pages need to
1e020 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a   be changed..  *
1e030 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67  *.  ** If pDbPag
1e040 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1e050 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
1e060 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d 61  first 4 bytes ma
1e070 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70  y store a.  ** p
1e080 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73  ointer to a subs
1e090 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
1e0a0 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69 73  page. If this is
1e0b0 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a   the case, then.
1e0c0 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72    ** the pointer
1e0d0 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65   map needs to be
1e0e0 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68 65   updated for the
1e0f0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
1e100 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  flow page..  */.
1e110 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1e120 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1e130 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1e140 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1e150 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1e160 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1e170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e180 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e190 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  rc;.    }.  }els
1e1a0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  e{.    Pgno next
1e1b0 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
1e1c0 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  pDbPage->aData);
1e1d0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66  .    if( nextOvf
1e1e0 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74  l!=0 ){.      pt
1e1f0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78  rmapPut(pBt, nex
1e200 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  tOvfl, PTRMAP_OV
1e210 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61  ERFLOW2, iFreePa
1e220 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20  ge, &rc);.      
1e230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e240 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1e250 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1e260 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1e270 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65  Fix the database
1e280 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65   pointer on page
1e290 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20 70   iPtrPage that p
1e2a0 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61 67  ointed at iDbPag
1e2b0 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69  e so.  ** that i
1e2c0 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65  t points at iFre
1e2d0 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20  ePage. Also fix 
1e2e0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
1e2f0 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69  entry for.  ** i
1e300 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  PtrPage..  */.  
1e310 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1e320 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1e330 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
1e340 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
1e350 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
1e360 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e380 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e390 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
1e3a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
1e3b0 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
1e3c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1e3d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e3e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
1e3f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
1e400 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1e410 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
1e420 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
1e430 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
1e440 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
1e450 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1e460 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1e470 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e480 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
1e490 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
1e4a0 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
1e4b0 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a  ge, &rc);.    }.
1e4c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1e4d0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
1e4e0 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
1e4f0 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
1e500 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
1e510 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
1e520 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
1e530 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
1e540 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
1e550 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
1e560 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
1e570 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
1e580 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
1e590 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
1e5a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  .** SQLITE_OK. I
1e5b0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
1e5c0 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
1e5d0 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74  erefore no point
1e5e0 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   in .** calling 
1e5f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
1e600 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c  ain), return SQL
1e610 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66  ITE_DONE. Or, if
1e620 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
1e630 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d  curs, return som
1e640 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1e650 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  de..**.** More s
1e660 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69  pecifically, thi
1e670 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
1e680 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
1e690 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ze the database 
1e6a0 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  so .** that the 
1e6b0 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
1e6c0 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
1e6d0 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e  in use is no lon
1e6e0 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a  ger in use..**.*
1e6f0 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e  * Parameter nFin
1e700 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1e710 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 69  f pages that thi
1e720 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64  s database would
1e730 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65   contain.** were
1e740 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1e750 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72  alled until it r
1e760 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1e770 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  NE..**.** If the
1e780 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74   bCommit paramet
1e790 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
1e7a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  this function as
1e7b0 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a  sumes that the .
1e7c0 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b  ** caller will k
1e7d0 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72  eep calling incr
1e7e0 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74  VacuumStep() unt
1e7f0 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  il it returns SQ
1e800 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72  LITE_DONE .** or
1e810 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d   an error. bComm
1e820 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72 75  it is passed tru
1e830 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  e for an auto-va
1e840 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a  cuum-on-commit .
1e850 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72  ** operation, or
1e860 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e   false for an in
1e870 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1e880 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e890 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
1e8a0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
1e8b0 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c  no nFin, Pgno iL
1e8c0 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d  astPg, int bComm
1e8d0 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  it){.  Pgno nFre
1e8e0 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
1e8f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1e900 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
1e910 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20   free-list */.  
1e920 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1e930 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1e940 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1e950 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
1e960 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a  LastPg>nFin );..
1e970 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53    if( !PTRMAP_IS
1e980 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50  PAGE(pBt, iLastP
1e990 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50  g) && iLastPg!=P
1e9a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1e9b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20  (pBt) ){.    u8 
1e9c0 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
1e9d0 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
1e9e0 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
1e9f0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ea00 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
1ea10 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
1ea20 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1ea30 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
1ea40 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
1ea50 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
1ea60 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20  LastPg, &eType, 
1ea70 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
1ea80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ea90 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1eaa0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1eab0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1eac0 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20  P_ROOTPAGE ){.  
1ead0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1eae0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1eaf0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65      }..    if( e
1eb00 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
1eb10 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69  EPAGE ){.      i
1eb20 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1eb30 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
1eb40 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
1eb50 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
1eb60 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
1eb70 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
1eb80 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74     ** if bCommit
1eb90 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
1eba0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
1ebb0 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
1ebc0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
1ebd0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
1ebe0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1ebf0 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
1ec00 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
1ec10 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
1ec20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
1ec30 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
1ec40 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
1ec50 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
1ec60 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
1ec70 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1ec80 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1ec90 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1eca0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1ecb0 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
1ecc0 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43  Pg, BTALLOC_EXAC
1ecd0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
1ece0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ecf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1ed00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1ed10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ed20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
1ed30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
1ed40 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
1ed50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
1ed60 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
1ed70 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
1ed80 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
1ed90 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
1eda0 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
1edb0 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
1edc0 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20   *pLastPg;.     
1edd0 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c   u8 eMode = BTAL
1ede0 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f  LOC_ANY;   /* Mo
1edf0 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  de parameter for
1ee00 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1ee10 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67  ge() */.      Pg
1ee20 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20  no iNear = 0;   
1ee30 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62          /* nearb
1ee40 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  y parameter for 
1ee50 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1ee60 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63  e() */..      rc
1ee70 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1ee80 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
1ee90 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
1eea0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1eeb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1eec0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1eed0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62  }..      /* If b
1eee0 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20  Commit is zero, 
1eef0 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65  this loop runs e
1ef00 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20  xactly once and 
1ef10 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20  page pLastPg.   
1ef20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64     ** is swapped
1ef30 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
1ef40 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64  free page pulled
1ef50 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c 69   off the free li
1ef60 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  st..      **.   
1ef70 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68     ** On the oth
1ef80 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d  er hand, if bCom
1ef90 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20 74  mit is greater t
1efa0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b  han zero, then k
1efb0 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  eep.      ** loo
1efc0 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65  ping until a fre
1efd0 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77  e-page located w
1efe0 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74 20  ithin the first 
1eff0 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20  nFin pages.     
1f000 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20   ** of the file 
1f010 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20  is found..      
1f020 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f  */.      if( bCo
1f030 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mmit==0 ){.     
1f040 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c     eMode = BTALL
1f050 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69  OC_LE;.        i
1f060 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20  Near = nFin;.   
1f070 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a     }.      do {.
1f080 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
1f090 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
1f0a0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
1f0b0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
1f0c0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
1f0d0 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b  , iNear, eMode);
1f0e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1f0f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f100 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1f110 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1f120 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1f130 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1f140 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1f150 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1f160 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74   }while( bCommit
1f170 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
1f180 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1f190 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
1f1a0 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
1f1b0 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50    rc = relocateP
1f1c0 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67  age(pBt, pLastPg
1f1d0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
1f1e0 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d  e, iFreePg, bCom
1f1f0 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  mit);.      rele
1f200 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
1f210 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f230 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f240 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f250 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74  }..  if( bCommit
1f260 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  ==0 ){.    do {.
1f270 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b        iLastPg--;
1f280 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61  .    }while( iLa
1f290 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg==PENDING_BY
1f2a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20  TE_PAGE(pBt) || 
1f2b0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1f2c0 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20  t, iLastPg) );. 
1f2d0 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63     pBt->bDoTrunc
1f2e0 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74  ate = 1;.    pBt
1f2f0 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50  ->nPage = iLastP
1f300 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  g;.  }.  return 
1f310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f320 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73 65  .** The database
1f330 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 66   opened by the f
1f340 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1f350 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1f360 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69  database.** nOri
1f370 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20  g pages in size 
1f380 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65  containing nFree
1f390 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65 74   free pages. Ret
1f3a0 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65 64  urn the expected
1f3b0 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65   .** size of the
1f3c0 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61 67   database in pag
1f3d0 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  es following an 
1f3e0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72  auto-vacuum oper
1f3f0 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
1f400 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a   Pgno finalDbSiz
1f410 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  e(BtShared *pBt,
1f420 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e   Pgno nOrig, Pgn
1f430 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20  o nFree){.  int 
1f440 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20  nEntry;         
1f450 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f460 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1f470 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70   on one ptrmap p
1f480 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50  age */.  Pgno nP
1f490 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20  trmap;          
1f4a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f4b0 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67  er of PtrMap pag
1f4c0 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  es to be freed *
1f4d0 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20  /.  Pgno nFin;  
1f4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4f0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
1f500 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79  lue */..  nEntry
1f510 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
1f520 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20  ze/5;.  nPtrmap 
1f530 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
1f540 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
1f550 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29  , nOrig)+nEntry)
1f560 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20  /nEntry;.  nFin 
1f570 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
1f580 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28  - nPtrmap;.  if(
1f590 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42   nOrig>PENDING_B
1f5a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26 26  YTE_PAGE(pBt) &&
1f5b0 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59   nFin<PENDING_BY
1f5c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1f5d0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
1f5e0 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1f5f0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
1f600 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
1f610 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1f620 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b  ) ){.    nFin--;
1f630 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
1f640 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  Fin;.}../*.** A 
1f650 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1f660 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
1f670 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
1f680 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1f690 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
1f6a0 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
1f6b0 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
1f6c0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1f6d0 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
1f6e0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1f6f0 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
1f700 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
1f710 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
1f720 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
1f730 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
1f740 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
1f750 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1f760 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  rred,.** SQLITE_
1f770 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
1f780 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
1f790 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
1f7a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f7b0 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
1f7c0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1f7d0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
1f7e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
1f7f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1f800 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
1f810 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1f820 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1f830 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
1f840 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
1f850 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56   if( !pBt->autoV
1f860 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
1f870 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1f880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
1f890 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
1f8a0 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
1f8b0 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67    Pgno nFree = g
1f8c0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1f8d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1f8e0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  ;.    Pgno nFin 
1f8f0 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42  = finalDbSize(pB
1f900 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29  t, nOrig, nFree)
1f910 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  ;..    if( nOrig
1f920 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72  <nFin ){.      r
1f930 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1f940 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
1f950 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29  se if( nFree>0 )
1f960 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1f970 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1f980 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
1f990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f9a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c  ){.        inval
1f9b0 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
1f9c0 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
1f9d0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
1f9e0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69  uumStep(pBt, nFi
1f9f0 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20  n, nOrig, 0);.  
1fa00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1fa10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1fa20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1fa30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fa40 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
1fa50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
1fa60 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1fa70 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c  age1->aData[28],
1fa80 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1fa90 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
1faa0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1fab0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
1fac0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
1fad0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1fae0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1faf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1fb00 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f   called prior to
1fb10 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1fb20 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73  mit when a trans
1fb30 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d  action.** is com
1fb40 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mitted for an au
1fb50 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1fb60 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
1fb70 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1fb80 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
1fb90 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
1fba0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
1fbb0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1fbc0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
1fbd0 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
1fbe0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
1fbf0 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
1fc00 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1fc10 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
1fc20 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
1fc30 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
1fc40 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
1fc50 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
1fc60 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
1fc70 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
1fc80 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  pBt){.  int rc =
1fc90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
1fca0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1fcb0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41  t->pPager;.  VVA
1fcc0 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20  _ONLY( int nRef 
1fcd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
1fce0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20  fcount(pPager); 
1fcf0 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  )..  assert( sql
1fd00 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1fd10 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1fd20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1fd30 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1fd40 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e  ;.  assert(pBt->
1fd50 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69  autoVacuum);.  i
1fd60 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63  f( !pBt->incrVac
1fd70 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
1fd80 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a  nFin;         /*
1fd90 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1fda0 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66 74   in database aft
1fdb0 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67  er autovacuuming
1fdc0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72   */.    Pgno nFr
1fdd0 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ee;        /* Nu
1fde0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
1fdf0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e   the freelist in
1fe00 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50  itially */.    P
1fe10 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20  gno iFree;      
1fe20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61    /* The next pa
1fe30 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a  ge to be freed *
1fe40 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67  /.    Pgno nOrig
1fe50 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  ;        /* Data
1fe60 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65  base size before
1fe70 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20   freeing */..   
1fe80 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61   nOrig = btreePa
1fe90 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
1fea0 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
1feb0 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
1fec0 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e  || nOrig==PENDIN
1fed0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1fee0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20   ){.      /* It 
1fef0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
1ff00 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74 61  to create a data
1ff10 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20 74  base for which t
1ff20 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20  he final page.  
1ff30 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72      ** is either
1ff40 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
1ff50 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69  age or the pendi
1ff60 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66  ng-byte page. If
1ff70 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73   one.      ** is
1ff80 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68   encountered, th
1ff90 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72  is indicates cor
1ffa0 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  ruption..      *
1ffb0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1ffc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ffd0 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  PT;.    }..    n
1ffe0 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1fff0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
20000 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46  ata[36]);.    nF
20010 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
20020 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
20030 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69  ee);.    if( nFi
20040 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e  n>nOrig ) return
20050 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20060 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46  BKPT;.    if( nF
20070 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20  in<nOrig ){.    
20080 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
20090 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
200a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
200b0 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72  iFree=nOrig; iFr
200c0 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53  ee>nFin && rc==S
200d0 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d  QLITE_OK; iFree-
200e0 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69  -){.      rc = i
200f0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
20100 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20  t, nFin, iFree, 
20110 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
20120 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
20130 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
20140 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
20150 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
20160 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20170 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
20180 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74  Page);.      put
20190 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
201a0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30  e1->aData[32], 0
201b0 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
201c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
201d0 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20  aData[36], 0);. 
201e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
201f0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20200 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20  a[28], nFin);.  
20210 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
20220 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  cate = 1;.      
20230 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69  pBt->nPage = nFi
20240 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
20250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20260 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
20270 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
20280 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
20290 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e  .  assert( nRef>
202a0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66  =sqlite3PagerRef
202b0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b  count(pPager) );
202c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
202d0 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66  .#else /* ifndef
202e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
202f0 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66  OVACUUM */.# def
20300 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d  ine setChildPtrm
20310 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b  aps(x) SQLITE_OK
20320 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
20330 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
20340 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
20350 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20   of a two-phase 
20360 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f  commit.  This ro
20370 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20  utine.** causes 
20380 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  a rollback journ
20390 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  al to be created
203a0 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74   (if it does not
203b0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a   already exist).
203c0 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64  ** and populated
203d0 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66   with enough inf
203e0 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
203f0 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73   if a power loss
20400 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64   occurs.** the d
20410 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72  atabase can be r
20420 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
20430 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79  riginal state by
20440 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a   playing back.**
20450 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54   the journal.  T
20460 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hen the contents
20470 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
20480 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20  are flushed out 
20490 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20  to.** the disk. 
204a0 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e   After the journ
204b0 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20  al is safely on 
204c0 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67  oxide, the chang
204d0 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74  es to the.** dat
204e0 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65  abase are writte
204f0 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  n into the datab
20500 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75  ase file and flu
20510 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a  shed to oxide..*
20520 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * At the end of 
20530 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72  this call, the r
20540 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
20550 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20  still exists on 
20560 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
20570 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c  we are still hol
20580 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20  ding all locks, 
20590 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  so the transacti
205a0 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f  on has not.** co
205b0 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71  mmitted.  See sq
205c0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
205d0 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74  PhaseTwo() for t
205e0 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
205f0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74  of the.** commit
20600 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
20610 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  This call is a n
20620 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65  o-op if no write
20630 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
20640 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
20650 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f   on pBt..**.** O
20660 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74  therwise, sync t
20670 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20680 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20 70   for the btree p
20690 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e  Bt. zMaster poin
206a0 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  ts to.** the nam
206b0 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  e of a master jo
206c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20  urnal file that 
206d0 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65  should be writte
206e0 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e  n into the.** in
206f0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
20700 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c   file, or is NUL
20710 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f  L, indicating no
20720 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
20730 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65  file .** (single
20740 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
20750 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68  ction)..**.** Wh
20760 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
20770 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  d, the master jo
20780 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72  urnal should alr
20790 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a  eady have been.*
207a0 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c  * created, popul
207b0 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 6a  ated with this j
207c0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61  ournal pointer a
207d0 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  nd synced to dis
207e0 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68  k..**.** Once th
207f0 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61  is is routine ha
20800 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
20810 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69  only thing requi
20820 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a  red to commit.**
20830 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73   the write-trans
20840 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20  action for this 
20850 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
20860 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
20870 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  ournal..*/.int s
20880 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20890 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20  tPhaseOne(Btree 
208a0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
208b0 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
208c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
208d0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
208e0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
208f0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
20900 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
20910 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
20920 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53  er(p);.#ifndef S
20930 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
20940 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
20950 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
20960 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
20970 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
20980 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
20990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
209a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
209b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
209c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
209d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
209e0 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75   if( pBt->bDoTru
209f0 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73  ncate ){.      s
20a00 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
20a10 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50  ateImage(pBt->pP
20a20 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65  ager, pBt->nPage
20a30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
20a40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20a50 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
20a60 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  One(pBt->pPager,
20a70 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
20a80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20a90 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
20aa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20ab0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20ac0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62  is called from b
20ad0 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50  oth BtreeCommitP
20ae0 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74  haseTwo() and Bt
20af0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a  reeRollback().**
20b00 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69   at the conclusi
20b10 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  on of a transact
20b20 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
20b30 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e  oid btreeEndTran
20b40 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70  saction(Btree *p
20b50 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
20b60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
20b70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
20b80 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
20b90 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
20ba0 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e  utex(p) );..#ifn
20bb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20bc0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74  AUTOVACUUM.  pBt
20bd0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
20be0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  0;.#endif.  if( 
20bf0 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53  p->inTrans>TRANS
20c00 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64  _NONE && db->nVd
20c10 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20  beRead>1 ){.    
20c20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
20c30 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74 61  other active sta
20c40 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c  tements that bel
20c50 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74 61  ong to this data
20c60 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64  base.    ** hand
20c70 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f  le, downgrade to
20c80 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61   a read-only tra
20c90 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74  nsaction. The ot
20ca0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20  her statements. 
20cb0 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20     ** may still 
20cc0 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20  be reading from 
20cd0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a  the database.  *
20ce0 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41  /.    downgradeA
20cf0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
20d00 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
20d10 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
20d20 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65  NS_READ;.  }else
20d30 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
20d40 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b  handle had any k
20d50 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69  ind of transacti
20d60 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65  on open, decreme
20d70 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74  nt the .    ** t
20d80 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
20d90 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62   of the shared b
20da0 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61  tree. If the tra
20db0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a  nsaction count .
20dc0 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30      ** reaches 0
20dd0 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  , set the shared
20de0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
20df0 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
20e00 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a  BtreeIfUnused().
20e10 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f      ** call belo
20e20 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68  w will unlock th
20e30 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20  e pager.  */.   
20e40 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
20e50 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
20e60 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61       clearAllSha
20e70 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
20e80 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74  ks(p);.      pBt
20e90 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
20ea0 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
20eb0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
20ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
20ed0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
20ee0 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
20ef0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20f00 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72 65  /* Set the curre
20f10 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
20f20 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
20f30 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  NE and unlock th
20f40 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  e .    ** pager 
20f50 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f  if this call clo
20f60 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61  sed the only rea
20f70 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
20f80 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  action.  */.    
20f90 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
20fa0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c  NS_NONE;.    unl
20fb0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
20fc0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
20fd0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
20fe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
20ff0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21000 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72   currently in pr
21010 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ogress..**.** Th
21020 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65  is routine imple
21030 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64  ments the second
21040 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68   phase of a 2-ph
21050 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65  ase commit.  The
21060 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
21070 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
21080 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
21090 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61 6e  e first phase an
210a0 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69  d should.** be i
210b0 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20  nvoked prior to 
210c0 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
210d0 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74  tine.  The sqlit
210e0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
210f0 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69  seOne().** routi
21100 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77  ne did all the w
21110 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
21120 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
21130 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
21140 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
21150 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
21160 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
21170 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
21180 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
21190 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
211a0 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
211b0 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f  truncate or zero
211c0 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20 74   the header in t
211d0 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  he.** the rollba
211e0 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63  ck journal (whic
211f0 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72 61  h causes the tra
21200 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d  nsaction to comm
21210 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20  it) and.** drop 
21220 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72  locks..**.** Nor
21230 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  mally, if an err
21240 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
21250 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
21260 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  is attempting to
21270 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68   .** finalize th
21280 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75  e underlying jou
21290 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20  rnal file, this 
212a0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
212b0 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a   an error and.**
212c0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
212d0 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20   will attempt a 
212e0 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65  rollback. Howeve
212f0 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  r, if the second
21300 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
21310 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68  non-zero then th
21320 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61  is b-tree transa
21330 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66  ction is part of
21340 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a   a multi-file .*
21350 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
21360 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
21370 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
21380 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f   already been co
21390 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20  mmitted .** (by 
213a0 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65  deleting a maste
213b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  r journal file) 
213c0 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77  and the caller w
213d0 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20  ill ignore this 
213e0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  .** functions re
213f0 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65  turn code. So, e
21400 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ven if an error 
21410 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70 61  occurs in the pa
21420 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65  ger layer,.** re
21430 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f  set the b-tree o
21440 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20  bjects internal 
21450 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74  state to indicat
21460 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74 65  e that the write
21470 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
21480 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e  has been closed.
21490 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20 73   This is quite s
214a0 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67 65  afe, as the page
214b0 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74  r will have.** t
214c0 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74  ransitioned to t
214d0 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a  he error state..
214e0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
214f0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
21500 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
21510 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
21520 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
21530 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
21540 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
21550 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
21560 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21570 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
21580 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  wo(Btree *p, int
21590 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69   bCleanup){..  i
215a0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
215b0 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75  RANS_NONE ) retu
215c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
215d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
215e0 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
215f0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
21600 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
21610 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
21620 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
21630 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
21640 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
21650 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
21660 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
21670 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
21680 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
21690 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
216a0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
216b0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
216c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
216d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
216e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
216f0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20  ANS_WRITE );.   
21700 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54   assert( pBt->nT
21710 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a  ransaction>0 );.
21720 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21730 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
21740 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Two(pBt->pPager)
21750 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
21760 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61  LITE_OK && bClea
21770 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nup==0 ){.      
21780 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21790 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
217a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
217b0 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e   p->iDataVersion
217c0 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61  --;  /* Compensa
217d0 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69  te for pPager->i
217e0 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a  DataVersion++; *
217f0 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  /.    pBt->inTra
21800 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
21810 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65  _READ;.    btree
21820 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
21830 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  pBt);.  }..  btr
21840 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
21850 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
21860 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
21870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21880 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74  .}../*.** Do bot
21890 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f  h phases of a co
218a0 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mmit..*/.int sql
218b0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
218c0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
218d0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
218e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
218f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
21900 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
21910 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 0);.  if( rc==
21920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
21940 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
21950 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71  (p, 0);.  }.  sq
21960 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
21970 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
21980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
21990 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
219a0 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f  state to CURSOR_
219b0 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72  FAULT and the er
219c0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65  ror.** code to e
219d0 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79  rrCode for every
219e0 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42   cursor on any B
219f0 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42 74  tShared that pBt
21a00 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ree.** reference
21a10 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77 72  s.  Or if the wr
21a20 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20  iteOnly flag is 
21a30 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f  set to 1, then o
21a40 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74  nly.** trip writ
21a50 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65  e cursors and le
21a60 61 76 65 20 72 65 61 64 20 63 75 72 73 6f 72 73  ave read cursors
21a70 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
21a80 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
21a90 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  s a candidate to
21aa0 20 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63   be tripped, inc
21ab0 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a  luding cursors.*
21ac0 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  * that belong to
21ad0 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
21ae0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
21af0 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a   happen to be.**
21b00 20 73 68 61 72 69 6e 67 20 74 68 65 20 63 61 63   sharing the cac
21b10 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a  he with pBtree..
21b20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
21b30 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ne gets called w
21b40 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  hen a rollback o
21b50 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 77 72  ccurs. If the wr
21b60 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20  iteOnly.** flag 
21b70 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e  is true, then on
21b80 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  ly write-cursors
21b90 20 6e 65 65 64 20 62 65 20 74 72 69 70 70 65 64   need be tripped
21ba0 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20   - read-only.** 
21bb0 63 75 72 73 6f 72 73 20 73 61 76 65 20 74 68 65  cursors save the
21bc0 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  ir current posit
21bd0 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65  ions so that the
21be0 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a  y may continue .
21bf0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ** following the
21c00 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69   rollback. Or, i
21c10 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  f writeOnly is f
21c20 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72  alse, all cursor
21c30 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65  s are .** trippe
21c40 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77  d. In general, w
21c50 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
21c60 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63  e if the transac
21c70 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f  tion being.** ro
21c80 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69  lled back modifi
21c90 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ed the database 
21ca0 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20  schema. In this 
21cb0 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74  case b-tree root
21cc0 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65  .** pages may be
21cd0 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65   moved or delete
21ce0 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
21cf0 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20  ase altogether, 
21d00 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73  making.** it uns
21d10 61 66 65 20 66 6f 72 20 72 65 61 64 20 63 75 72  afe for read cur
21d20 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  sors to continue
21d30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
21d40 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73  riteOnly flag is
21d50 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72   true and an err
21d60 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
21d70 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69  d while .** savi
21d80 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ng the current p
21d90 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61  osition of a rea
21da0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61  d-only cursor, a
21db0 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20  ll cursors, .** 
21dc0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65  including all re
21dd0 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74  ad-cursors are t
21de0 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ripped..**.** SQ
21df0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
21e00 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75  ned if successfu
21e10 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  l, or if an erro
21e20 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a  r occurs while.*
21e30 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f  * saving a curso
21e40 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53  r position, an S
21e50 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
21e60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21e70 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
21e80 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  ors(Btree *pBtre
21e90 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20  e, int errCode, 
21ea0 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
21eb0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
21ec0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21ed0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
21ee0 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c  (writeOnly==0 ||
21ef0 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26   writeOnly==1) &
21f00 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
21f10 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ==1 );.  if( pBt
21f20 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
21f30 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
21f40 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d  ree);.    for(p=
21f50 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
21f60 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
21f70 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
21f80 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d  writeOnly && (p-
21f90 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
21fa0 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29  _WriteFlag)==0 )
21fb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
21fc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21fd0 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
21fe0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
21ff0 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
22000 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
22010 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
22020 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
22030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22040 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
22050 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
22060 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c  lCursors(pBtree,
22070 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   rc, 0);.       
22080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
22090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
220a0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
220b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
220c0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
220d0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  );.        p->eS
220e0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
220f0 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ULT;.        p->
22100 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
22110 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
22120 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c    btreeReleaseAl
22130 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b  lCursorPages(p);
22140 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22150 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
22160 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
22170 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22180 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
22190 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
221a0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ress..**.** If t
221b0 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53  ripCode is not S
221c0 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75  QLITE_OK then cu
221d0 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
221e0 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70 70  validated (tripp
221f0 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ed)..** Only wri
22200 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 74  te cursors are t
22210 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
22220 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74 20  nly is true but 
22230 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a  all cursors are.
22240 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77 72  ** tripped if wr
22250 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
22260 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
22270 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70  o use.** a tripp
22280 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72  ed cursor will r
22290 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
222a0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
222b0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
222c0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
222d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
222e0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
222f0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
22300 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
22310 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
22320 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
22330 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
22340 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72  Btree *p, int tr
22350 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  ipCode, int writ
22360 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  eOnly){.  int rc
22370 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
22380 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
22390 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a  mPage *pPage1;..
223a0 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65 4f    assert( writeO
223b0 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f  nly==1 || writeO
223c0 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
223d0 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  rt( tripCode==SQ
223e0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
223f0 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d  ACK || tripCode=
22400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
22410 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
22420 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70  r(p);.  if( trip
22430 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
22440 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70  ){.    rc = trip
22450 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75  Code = saveAllCu
22460 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
22470 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 77  ;.    if( rc ) w
22480 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  riteOnly = 0;.  
22490 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
224a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
224b0 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b   if( tripCode ){
224c0 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73  .    int rc2 = s
224d0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
224e0 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69  llCursors(p, tri
224f0 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79  pCode, writeOnly
22500 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
22510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
22520 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26  (writeOnly==0 &&
22530 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   rc2==SQLITE_OK)
22540 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21   );.    if( rc2!
22550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
22560 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72  = rc2;.  }.  btr
22570 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
22580 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
22590 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
225a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
225b0 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
225c0 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
225d0 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
225e0 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
225f0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
22600 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
22610 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
22620 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
22630 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
22640 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
22650 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
22660 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
22670 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
22680 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
22690 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
226a0 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
226b0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
226c0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
226d0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
226e0 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
226f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
22700 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
22710 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
22720 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34  int nPage = get4
22730 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
22740 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
22750 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61     testcase( nPa
22760 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
22770 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71  f( nPage==0 ) sq
22780 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
22790 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
227a0 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
227b0 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e  testcase( pBt->n
227c0 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20  Page!=nPage );. 
227d0 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
227e0 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  = nPage;.      r
227f0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
22800 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  age1);.    }.   
22810 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61   assert( countVa
22820 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20  lidCursors(pBt, 
22830 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  1)==0 );.    pBt
22840 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
22850 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
22860 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
22870 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d  ontent(pBt);.  }
22880 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
22890 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
228a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
228b0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
228c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
228d0 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
228e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
228f0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
22900 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20  an be rolled.** 
22910 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
22920 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
22930 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20  ransaction. You 
22940 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
22950 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66  nsaction .** bef
22960 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
22970 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
22980 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
22990 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d  n is ended autom
229a0 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20  atically .** if 
229b0 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
229c0 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20  tion commits or 
229d0 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  rolls back..**.*
229e0 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
229f0 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
22a00 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
22a10 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
22a20 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
22a30 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
22a40 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
22a50 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
22a60 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
22a70 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
22a80 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
22a90 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
22aa0 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
22ab0 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
22ac0 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
22ad0 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
22ae0 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
22af0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
22b00 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75  * A statement su
22b10 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  b-transaction is
22b20 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   implemented as 
22b30 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  an anonymous sav
22b40 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76  epoint. The.** v
22b50 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
22b60 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
22b70 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ter is the total
22b80 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
22b90 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64  oints,.** includ
22ba0 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e  ing the new anon
22bb0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c  ymous savepoint,
22bc0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54   open on the B-T
22bd0 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  ree. i.e. if the
22be0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
22bf0 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
22c00 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74  nd no other stat
22c10 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f  ement-transactio
22c20 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61  ns open,.** iSta
22c30 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69  tement is 1. Thi
22c40 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  s anonymous save
22c50 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c  point can be rel
22c60 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  eased or rolled 
22c70 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68  back.** using th
22c80 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  e sqlite3BtreeSa
22c90 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69  vepoint() functi
22ca0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
22cb0 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74  e3BtreeBeginStmt
22cc0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69  (Btree *p, int i
22cd0 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e  Statement){.  in
22ce0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
22cf0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
22d00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
22d10 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
22d20 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
22d30 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
22d40 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73  ssert( (pBt->bts
22d50 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
22d60 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61  _ONLY)==0 );.  a
22d70 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
22d80 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
22d90 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64   iStatement>p->d
22da0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b  b->nSavepoint );
22db0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
22dc0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
22dd0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
22de0 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20  /* At the pager 
22df0 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65  level, a stateme
22e00 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22e10 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69  s a savepoint wi
22e20 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  th.  ** an index
22e30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
22e40 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
22e50 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
22e60 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73  using.  ** SQL s
22e70 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73  tatements. It is
22e80 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e   illegal to open
22e90 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c  , release or rol
22ea0 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73  lback any.  ** s
22eb0 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
22ec0 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
22ed0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
22ee0 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
22ef0 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ve..  */.  rc = 
22f00 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
22f10 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
22f20 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e  Pager, iStatemen
22f30 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
22f40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
22f50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22f60 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
22f70 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
22f80 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
22f90 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
22fa0 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
22fb0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
22fc0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
22fd0 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
22fe0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
22ff0 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
23000 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
23010 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
23020 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
23030 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
23040 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
23050 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
23060 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
23070 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
23080 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
23090 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
230a0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
230b0 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
230c0 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
230d0 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
230e0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
230f0 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
23100 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
23110 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
23120 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
23130 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
23140 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
23150 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
23160 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
23170 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
23180 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
23190 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
231a0 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
231b0 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
231c0 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
231d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
231e0 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
231f0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
23200 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
23210 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
23220 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
23230 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
23240 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
23250 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
23260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
23270 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
23280 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
23290 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
232a0 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
232b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
232c0 65 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6f  er(p);.    if( o
232d0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
232e0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  LBACK ){.      r
232f0 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
23300 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
23310 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
23320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23330 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23340 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
23350 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20  Bt->pPager, op, 
23360 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
23370 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
23380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23390 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
233a0 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  <0 && (pBt->btsF
233b0 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49  lags & BTS_INITI
233c0 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29  ALLY_EMPTY)!=0 )
233d0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  {.        pBt->n
233e0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
233f0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  }.      rc = new
23400 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
23410 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
23420 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20  = get4byte(28 + 
23430 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
23440 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ta);..      /* T
23450 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
23460 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
23470 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20  o the offset 28 
23480 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20  of the header.  
23490 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
234a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
234b0 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20  ted, so we know 
234c0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61  that the value a
234d0 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a  t offset.      *
234e0 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e  * 28 is nonzero.
234f0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
23500 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
23510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23520 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
23530 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
23540 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
23550 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
23560 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
23570 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
23580 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
23590 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c  e. If a read-onl
235a0 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  y cursor is requ
235b0 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73  ested, it is ass
235c0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
235d0 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20   caller already 
235e0 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72  has at least a r
235f0 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
23600 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20  tion open.** on 
23610 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72  the database alr
23620 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65  eady. If a write
23630 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65  -cursor is reque
23640 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sted, then.** th
23650 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75  e caller is assu
23660 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f  med to have an o
23670 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
23680 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
23690 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
236a0 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73  bit of wrFlag is
236b0 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65   clear, then the
236c0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
236d0 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20  .** be used for 
236e0 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65  reading.  If the
236f0 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74   BTREE_WRCSR bit
23700 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
23710 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20  e cursor.** can 
23720 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
23730 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69  ing or for writi
23740 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
23750 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
23760 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d  ng.** are also m
23770 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20 74  et.  These are t
23780 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
23790 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
237a0 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77  n order.** for w
237b0 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c  riting to be all
237c0 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
237d0 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
237e0 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
237f0 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e   with wrFlag con
23800 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52  taining BTREE_WR
23810 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  CSR.**.** 2:  Ot
23820 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
23830 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
23840 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
23850 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
23860 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
23870 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
23880 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
23890 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
238a0 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
238b0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
238c0 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
238d0 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
238e0 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
238f0 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
23900 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
23910 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
23920 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
23930 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
23940 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
23950 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
23960 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
23970 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
23980 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
23990 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
239a0 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
239b0 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
239c0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
239d0 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  he BTREE_FORDELE
239e0 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  TE bit of wrFlag
239f0 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20   may optionally 
23a00 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45 5f  be set if BTREE_
23a10 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e  WRCSR.** is set.
23a20 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69    If FORDELETE i
23a30 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20 61  s set, that is a
23a40 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70   hint to the imp
23a50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
23a60 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20  .** this cursor 
23a70 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65  will only be use
23a80 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64  d to seek to and
23a90 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20   delete entries 
23aa0 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61  of an index.** a
23ab0 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67  s part of a larg
23ac0 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  er DELETE statem
23ad0 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c  ent.  The FORDEL
23ae0 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20  ETE hint is not 
23af0 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  used by.** this 
23b00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
23b10 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68   But in a hypoth
23b20 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69  etical alternati
23b30 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e  ve storage engin
23b40 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69  e .** in which i
23b50 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72 65  ndex entries are
23b60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
23b70 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72  eleted when corr
23b80 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a  esponding table.
23b90 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65  ** rows are dele
23ba0 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45  ted, the FORDELE
23bb0 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e  TE flag is a hin
23bc0 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20  t that all SEEK 
23bd0 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70  and DELETE.** op
23be0 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73  erations on this
23bf0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e   cursor can be n
23c00 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45  o-ops and all RE
23c10 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61  AD operations ca
23c20 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e  n .** return a n
23c30 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73  ull row (2-bytes
23c40 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a  : 0x01 0x00)..**
23c50 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
23c60 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
23c70 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
23c80 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
23c90 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
23ca0 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
23cb0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
23cc0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
23cd0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
23ce0 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
23cf0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
23d00 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
23d10 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
23d20 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
23d30 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
23d40 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
23d50 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
23d60 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
23d70 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
23d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23d90 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
23da0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
23dd0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
23de0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e00 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
23e10 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
23e20 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e40 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
23e50 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
23e60 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
23e70 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
23e80 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
23e90 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
23ea0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
23eb0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
23ec0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
23ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ee0 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
23ef0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
23f00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23f10 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
23f20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
23f30 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
23f40 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58  /.  BtCursor *pX
23f50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
23f70 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72  oping over other
23f80 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a   all cursors */.
23f90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23fa0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
23fb0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
23fc0 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20  ( wrFlag==0 .   
23fd0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42      || wrFlag==B
23fe0 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20  TREE_WRCSR .    
23ff0 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42     || wrFlag==(B
24000 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45  TREE_WRCSR|BTREE
24010 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29  _FORDELETE) .  )
24020 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
24030 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
24040 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
24050 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
24060 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
24070 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
24080 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
24090 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
240a0 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
240b0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
240c0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
240d0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
240e0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
240f0 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
24100 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
24110 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
24120 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
24130 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
24140 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28  , pKeyInfo!=0, (
24150 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a  wrFlag?2:1)) );.
24160 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
24170 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43  ==0 || !hasReadC
24180 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
24190 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  le) );..  /* Ass
241a0 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
241b0 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74  ler has opened t
241c0 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e  he required tran
241d0 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73  saction. */.  as
241e0 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
241f0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
24200 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
24210 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
24220 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
24230 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
24240 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70  pPage1 && pBt->p
24250 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
24260 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
24270 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73  ==0 || (pBt->bts
24280 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
24290 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20  _ONLY)==0 );..  
242a0 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20  if( wrFlag ){.  
242b0 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
242c0 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66  ace(pBt);.    if
242d0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
242e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
242f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
24300 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65    }.  if( iTable
24310 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65  ==1 && btreePage
24320 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b  count(pBt)==0 ){
24330 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46  .    assert( wrF
24340 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54  lag==0 );.    iT
24350 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  able = 0;.  }.. 
24360 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20   /* Now that no 
24370 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e  other errors can
24380 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66   occur, finish f
24390 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74  illing in the Bt
243a0 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69  Cursor.  ** vari
243b0 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74  ables and link t
243c0 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
243d0 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
243e0 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67  .  */.  pCur->pg
243f0 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
24400 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69  Table;.  pCur->i
24410 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75  Page = -1;.  pCu
24420 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  r->pKeyInfo = pK
24430 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e  eyInfo;.  pCur->
24440 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43  pBtree = p;.  pC
24450 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ur->pBt = pBt;. 
24460 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
24470 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f  = wrFlag ? BTCF_
24480 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20  WriteFlag : 0;. 
24490 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
244a0 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20  lags = wrFlag ? 
244b0 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 : PAGER_GET_RE
244c0 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20  ADONLY;.  /* If 
244d0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
244e0 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
244f0 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
24500 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20   then all such. 
24510 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73   ** cursors *mus
24520 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46  t* have the BTCF
24530 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
24540 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d  et. */.  for(pX=
24550 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58  pBt->pCursor; pX
24560 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
24570 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e  .    if( pX->pgn
24580 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61  oRoot==(Pgno)iTa
24590 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d  ble ){.      pX-
245a0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
245b0 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20  F_Multiple;.    
245c0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
245d0 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c   |= BTCF_Multipl
245e0 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  e;.    }.  }.  p
245f0 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74  Cur->pNext = pBt
24600 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74  ->pCursor;.  pBt
24610 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
24620 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
24630 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
24640 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  D;.  return SQLI
24650 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
24660 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
24670 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
24680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
246a0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
246b0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
246c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
246d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
246e0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
246f0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
24700 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
24730 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
24740 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
24750 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
24760 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
24770 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24780 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
24790 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
247a0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
247d0 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
247e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
247f0 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20  f( iTable<1 ){. 
24800 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
24810 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
24820 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
24830 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
24840 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75      rc = btreeCu
24850 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
24860 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
24870 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c  , pCur);.    sql
24880 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
24890 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
248a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
248b0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
248c0 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  a BtCursor objec
248d0 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  t in bytes..**.*
248e0 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65  * This interface
248f0 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74  s is needed so t
24900 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72  hat users of cur
24910 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f  sors can preallo
24920 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65  cate.** sufficie
24930 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f  nt storage to ho
24940 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  ld a cursor.  Th
24950 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63  e BtCursor objec
24960 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74  t is opaque.** t
24970 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20  o users so they 
24980 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69  cannot do the si
24990 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65  zeof() themselve
249a0 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61  s - they must ca
249b0 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ll.** this routi
249c0 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
249d0 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a  e3BtreeCursorSiz
249e0 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72  e(void){.  retur
249f0 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  n ROUND8(sizeof(
24a00 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f  BtCursor));.}../
24a10 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
24a20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
24a30 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   be converted in
24a40 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  to a BtCursor ob
24a50 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
24a60 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20  simple approach 
24a70 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  here would be to
24a80 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e   memset() the en
24a90 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  tire object.** t
24aa0 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20  o zero.  But it 
24ab0 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74  turns out that t
24ac0 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  he apPage[] and 
24ad0 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a  aiIdx[] arrays.*
24ae0 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f  * do not need to
24af0 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74   be zeroed and t
24b00 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73  hey are large, s
24b10 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20  o we can save a 
24b20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69  lot.** of run-ti
24b30 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74  me by skipping t
24b40 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  he initializatio
24b50 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65  n of those eleme
24b60 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nts..*/.void sql
24b70 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a  ite3BtreeCursorZ
24b80 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29  ero(BtCursor *p)
24b90 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
24ba0 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73   offsetof(BtCurs
24bb0 6f 72 2c 20 42 54 43 55 52 53 4f 52 5f 46 49 52  or, BTCURSOR_FIR
24bc0 53 54 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a  ST_UNINIT));.}..
24bd0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75  /*.** Close a cu
24be0 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20  rsor.  The read 
24bf0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
24c00 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c  base file is rel
24c10 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  eased.** when th
24c20 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73  e last cursor is
24c30 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20   closed..*/.int 
24c40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
24c50 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  eCursor(BtCursor
24c60 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65   *pCur){.  Btree
24c70 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d   *pBtree = pCur-
24c80 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70  >pBtree;.  if( p
24c90 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53  Btree ){.    BtS
24ca0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
24cb0 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  r->pBt;.    sqli
24cc0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
24cd0 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  tree);.    asser
24ce0 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21  t( pBt->pCursor!
24cf0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  =0 );.    if( pB
24d00 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72  t->pCursor==pCur
24d10 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
24d20 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
24d30 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
24d40 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20  .      BtCursor 
24d50 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43  *pPrev = pBt->pC
24d60 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b  ursor;.      do{
24d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
24d80 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20  ev->pNext==pCur 
24d90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  ){.          pPr
24da0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
24db0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
24dc0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24dd0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65    }.        pPre
24de0 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74  v = pPrev->pNext
24df0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
24e00 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b  ALWAYS(pPrev) );
24e10 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65  .    }.    btree
24e20 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
24e30 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
24e40 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
24e50 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
24e60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
24e70 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
24e80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24e90 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
24ea0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
24eb0 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
24ec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24ed0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
24ee0 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
24ef0 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
24f00 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
24f10 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
24f20 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
24f30 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
24f40 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
24f50 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
24f60 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
24f70 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
24f80 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
24f90 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
24fa0 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
24fb0 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
24fc0 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
24fd0 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
24fe0 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
24ff0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
25000 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
25010 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 69 6e  EBUG.  static in
25020 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28  t cellInfoEqual(
25030 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c  CellInfo *a, Cel
25040 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69  lInfo *b){.    i
25050 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e  f( a->nKey!=b->n
25060 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Key ) return 0;.
25070 20 20 20 20 69 66 28 20 61 2d 3e 70 50 61 79 6c      if( a->pPayl
25080 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64  oad!=b->pPayload
25090 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
250a0 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64   if( a->nPayload
250b0 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20  !=b->nPayload ) 
250c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
250d0 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e  ( a->nLocal!=b->
250e0 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75 72 6e 20  nLocal ) return 
250f0 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 53  0;.    if( a->nS
25100 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20  ize!=b->nSize ) 
25110 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65  return 0;.    re
25120 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74  turn 1;.  }.  st
25130 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
25140 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
25150 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
25160 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
25170 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30   memset(&info, 0
25180 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b  , sizeof(info));
25190 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
251a0 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
251b0 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f   pCur->ix, &info
251c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
251d0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c  ORRUPT_DB || cel
251e0 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f  lInfoEqual(&info
251f0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29  , &pCur->info) )
25200 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64  ;.  }.#else.  #d
25210 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c  efine assertCell
25220 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73  Info(x).#endif.s
25230 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
25240 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65  NLINE void getCe
25250 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
25260 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43  *pCur){.  if( pC
25270 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
25280 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63  0 ){.    pCur->c
25290 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
252a0 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62  ValidNKey;.    b
252b0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
252c0 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e  ur->pPage,pCur->
252d0 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  ix,&pCur->info);
252e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
252f0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75  sertCellInfo(pCu
25300 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  r);.  }.}..#ifnd
25310 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68  ef NDEBUG  /* Th
25320 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75  e next routine u
25330 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
25340 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
25350 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74  nts */./*.** Ret
25360 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
25370 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69  given BtCursor i
25380 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69  s valid.  A vali
25390 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a  d cursor is one.
253a0 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72 65  ** that is curre
253b0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
253c0 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e   a row in a (non
253d0 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a  -empty) table..*
253e0 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72 69  * This is a veri
253f0 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  fication routine
25400 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69   is used only wi
25410 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
25420 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74  atements..*/.int
25430 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
25440 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75 72  sorIsValid(BtCur
25450 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65  sor *pCur){.  re
25460 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43 75  turn pCur && pCu
25470 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25480 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69  R_VALID;.}.#endi
25490 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69  f /* NDEBUG */.i
254a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
254b0 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42  ursorIsValidNN(B
254c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
254d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
254e0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  0 );.  return pC
254f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25500 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
25510 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
25520 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67  lue of the integ
25530 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77 69 64  er key or "rowid
25540 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74  " for a table bt
25550 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ree..** This rou
25560 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c  tine is only val
25570 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  id for a cursor 
25580 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67  that is pointing
25590 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e   into a.** ordin
255a0 61 72 79 20 74 61 62 6c 65 20 62 74 72 65 65 2e  ary table btree.
255b0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
255c0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64  points to an ind
255d0 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69  ex btree or.** i
255e0 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 20 72  s invalid, the r
255f0 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 72 6f  esult of this ro
25600 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e  utine is undefin
25610 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  ed..*/.i64 sqlit
25620 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
25630 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
25640 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
25650 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
25660 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
25670 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
25680 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
25690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
256a0 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65  urIntKey );.  ge
256b0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
256c0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
256d0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69  info.nKey;.}..#i
256e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
256f0 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55  LE_OFFSET_SQL_FU
25700 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  NC./*.** Return 
25710 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
25720 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
25730 65 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  e for the start 
25740 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61  of the.** payloa
25750 64 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  d to which the c
25760 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
25770 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  g..*/.i64 sqlite
25780 33 42 74 72 65 65 4f 66 66 73 65 74 28 42 74 43  3BtreeOffset(BtC
25790 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
257a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
257b0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
257c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
257d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
257e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
257f0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
25800 20 72 65 74 75 72 6e 20 28 69 36 34 29 70 43 75   return (i64)pCu
25810 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  r->pBt->pageSize
25820 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70 50 61  *((i64)pCur->pPa
25830 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a  ge->pgno - 1) +.
25840 20 20 20 20 20 20 20 20 20 28 69 36 34 29 28 70           (i64)(p
25850 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
25860 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61 67 65  ad - pCur->pPage
25870 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64  ->aData);.}.#end
25880 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
25890 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46  BLE_OFFSET_SQL_F
258a0 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UNC */../*.** Re
258b0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
258c0 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c  of bytes of payl
258d0 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72  oad for the entr
258e0 79 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a  y that pCur is.*
258f0 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  * currently poin
25900 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61  ting to.  For ta
25910 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68 69 73  ble btrees, this
25920 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f   will be the amo
25930 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20  unt.** of data. 
25940 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65   For index btree
25950 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
25960 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
25970 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  key..**.** The c
25980 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
25990 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
259a0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
259b0 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
259c0 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
259d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
259e0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
259f0 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
25a00 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
25a10 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
25a20 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
25a30 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20  R_VALID..*/.u32 
25a40 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
25a50 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72  oadSize(BtCursor
25a60 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
25a70 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
25a80 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
25a90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25aa0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25ab0 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  D );.  getCellIn
25ac0 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
25ad0 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  rn pCur->info.nP
25ae0 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ayload;.}../*.**
25af0 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20   Given the page 
25b00 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65  number of an ove
25b10 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
25b20 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61  e database (para
25b30 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20  meter.** ovfl), 
25b40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69  this function fi
25b50 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nds the page num
25b60 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
25b70 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
25b80 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f  linked list of o
25b90 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
25ba0 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75  f possible, it u
25bb0 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ses the auto-vac
25bc0 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d  uum.** pointer-m
25bd0 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20  ap data instead 
25be0 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63  of reading the c
25bf0 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f  ontent of page o
25c00 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a  vfl to do so. .*
25c10 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
25c20 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74   occurs an SQLit
25c30 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
25c40 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
25c50 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ise:.**.** The p
25c60 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
25c70 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
25c80 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
25c90 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77  ed list is .** w
25ca0 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
25cb0 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
25cc0 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  fl is the last p
25cd0 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65  age in its linke
25ce0 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67  d .** list, *pPg
25cf0 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f  noNext is set to
25d00 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   zero. .**.** If
25d10 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e   ppPage is not N
25d20 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72  ULL, and a refer
25d30 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50  ence to the MemP
25d40 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65  age object corre
25d50 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70  sponding.** to p
25d60 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c  age number pOvfl
25d70 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74   was obtained, t
25d80 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73  hen *ppPage is s
25d90 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
25da0 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  hat.** reference
25db0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
25dc0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
25dd0 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c  e caller to call
25de0 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a   releasePage().*
25df0 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20  * on *ppPage to 
25e00 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e  free the referen
25e10 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65  ce. In no refere
25e20 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64  nce was obtained
25e30 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
25e40 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73   pointer-map was
25e50 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20   used to obtain 
25e60 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70  the value for *p
25e70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a  PgnoNext), then.
25e80 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  ** *ppPage is se
25e90 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  t to zero..*/.st
25ea0 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72  atic int getOver
25eb0 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68  flowPage(.  BtSh
25ec0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
25ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
25ef0 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20  .  Pgno ovfl,   
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f10 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66  /* Current overf
25f20 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20  low page number 
25f30 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
25f40 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
25f50 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67    /* OUT: MemPag
25f60 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65  e handle (may be
25f70 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f   NULL) */.  Pgno
25f80 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
25f90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
25fa0 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
25fb0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
25fc0 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
25fd0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
25fe0 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ge = 0;.  int rc
25ff0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
26000 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26010 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
26020 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
26030 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a  ert(pPgnoNext);.
26040 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26050 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
26060 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
26070 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
26080 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  n the overflow l
26090 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  ist using the.  
260a0 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f  ** autovacuum po
260b0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e  inter-map pages.
260c0 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20   Guess that the 
260d0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20  next page in .  
260e0 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  ** the overflow 
260f0 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d  list is page num
26100 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66  ber (ovfl+1). If
26110 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e   that guess turn
26120 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  s .  ** out to b
26130 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61  e wrong, fall ba
26140 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68  ck to loading th
26150 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a  e data of page .
26160 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c    ** number ovfl
26170 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
26180 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62  e next page numb
26190 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  er..  */.  if( p
261a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
261b0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b  {.    Pgno pgno;
261c0 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73  .    Pgno iGuess
261d0 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75   = ovfl+1;.    u
261e0 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68  8 eType;..    wh
261f0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
26200 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20  GE(pBt, iGuess) 
26210 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49  || iGuess==PENDI
26220 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
26230 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73  ) ){.      iGues
26240 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s++;.    }..    
26250 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65  if( iGuess<=btre
26260 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
26270 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
26280 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75  rmapGet(pBt, iGu
26290 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67  ess, &eType, &pg
262a0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
262b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
262c0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
262d0 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d  ERFLOW2 && pgno=
262e0 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20  =ovfl ){.       
262f0 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a   next = iGuess;.
26300 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26310 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
26320 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
26330 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65  if..  assert( ne
26340 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  xt==0 || rc==SQL
26350 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
26360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26370 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ){.    rc = btre
26380 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
26390 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50  fl, &pPage, (ppP
263a0 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f  age==0) ? PAGER_
263b0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
263c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
263d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
263e0 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pPage==0 );.    
263f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26400 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
26410 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
26420 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
26430 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78    }..  *pPgnoNex
26440 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20  t = next;.  if( 
26450 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  ppPage ){.    *p
26460 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20  pPage = pPage;. 
26470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65   }else{.    rele
26480 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
26490 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63    }.  return (rc
264a0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20  ==SQLITE_DONE ? 
264b0 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b  SQLITE_OK : rc);
264c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64  .}../*.** Copy d
264d0 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
264e0 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20  r to a page, or 
264f0 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61  from a page to a
26500 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70   buffer..**.** p
26510 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69  Payload is a poi
26520 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f  nter to data sto
26530 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20  red on database 
26540 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a  page pDbPage..**
26550 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70   If argument eOp
26560 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
26570 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64  nByte bytes of d
26580 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a  ata are copied.*
26590 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20  * from pPayload 
265a0 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
265b0 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66  inted at by pBuf
265c0 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65  . If eOp is true
265d0 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65  ,.** then sqlite
265e0 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
265f0 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61   called on pDbPa
26600 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74  ge and nByte byt
26610 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72  es.** of data ar
26620 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
26630 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f  e buffer pBuf to
26640 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a   pPayload..**.**
26650 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
26660 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
26670 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  s, otherwise an 
26680 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
26690 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61  tatic int copyPa
266a0 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70  yload(.  void *p
266b0 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  Payload,        
266c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
266d0 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
266e0 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
266f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
26700 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a  nter to buffer *
26710 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26730 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
26740 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
26750 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t eOp,          
26760 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20          /* 0 -> 
26770 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20  copy from page, 
26780 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67  1 -> copy to pag
26790 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70  e */.  DbPage *p
267a0 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20  DbPage          
267b0 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
267c0 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a  ing pPayload */.
267d0 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a  ){.  if( eOp ){.
267e0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
267f0 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20   from buffer to 
26800 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70  page (a write op
26810 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
26820 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
26830 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
26840 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
26850 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26860 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26870 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
26880 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20  pPayload, pBuf, 
26890 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
268a0 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
268b0 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62  a from page to b
268c0 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70  uffer (a read op
268d0 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
268e0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61  memcpy(pBuf, pPa
268f0 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20  yload, nByte);. 
26900 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
26910 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26920 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26930 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72   used to read or
26940 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f   overwrite paylo
26950 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ad information.*
26960 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * for the entry 
26970 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75  that the pCur cu
26980 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
26990 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20   to. The eOp.** 
269a0 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65  argument is inte
269b0 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
269c0 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54  ws:.**.**   0: T
269d0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
269e0 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65  a read. Populate
269f0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
26a00 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65  che..**   1: The
26a10 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
26a20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20  write. Populate 
26a30 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
26a40 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  he..**.** A tota
26a50 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
26a60 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
26a70 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
26a80 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
26a90 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
26aa0 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
26ab0 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
26ac0 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
26ad0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
26ae0 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20  might appear on 
26af0 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a  the main page.**
26b00 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
26b10 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
26b20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
26b30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
26b40 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
26b50 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
26b60 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
26b70 65 73 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  es.** this funct
26b80 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65  ion may allocate
26b90 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
26ba0 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a  azily populate.*
26bb0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  * the overflow p
26bc0 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61  age-list cache a
26bd0 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61  rray (BtCursor.a
26be0 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53  Overflow). .** S
26bf0 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
26c00 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74  use this cache t
26c10 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74  o make seeking t
26c20 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f  o the supplied o
26c30 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65  ffset .** more e
26c40 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  fficient..**.** 
26c50 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  Once an overflow
26c60 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
26c70 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
26c80 74 65 64 2c 20 69 74 20 6d 75 73 74 20 62 65 0a  ted, it must be.
26c90 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
26ca0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
26cb0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
26cc0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
26cd0 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
26ce0 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
26cf0 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
26d00 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
26d10 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
26d20 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
26d30 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
26d40 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
26d50 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
26d60 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
26d70 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
26d80 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
26d90 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
26da0 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
26db0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
26dc0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
26dd0 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
26de0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
26df0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26e00 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
26e10 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
26e20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
26e30 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
26e40 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
26e50 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
26e60 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
26e70 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
26e80 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
26e90 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
26ea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
26eb0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
26ec0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
26ed0 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
26ee0 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
26ef0 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
26f00 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
26f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
26f20 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
26f30 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
26f40 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
26f50 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
26f60 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26f70 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78  E_OK;.  int iIdx
26f80 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
26f90 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
26fa0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
26fb0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61 67      /* Btree pag
26fc0 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
26fd0 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
26fe0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
26ff0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27000 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
27010 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
27020 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   to */.#ifdef SQ
27030 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
27040 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69  FLOW_READ.  unsi
27050 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73  gned char * cons
27060 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42  t pBufStart = pB
27070 75 66 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74  uf;     /* Start
27080 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74   of original out
27090 20 62 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69   buffer */.#endi
270a0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
270b0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
270c0 65 4f 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31  eOp==0 || eOp==1
270d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
270e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
270f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
27100 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
27110 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
27120 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27130 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27140 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
27150 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
27160 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
27170 2e 70 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73  .pPayload;.  ass
27180 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20  ert( offset+amt 
27190 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  <= pCur->info.nP
271a0 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73  ayload );..  ass
271b0 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20  ert( aPayload > 
271c0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
271d0 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50 61    if( (uptr)(aPa
271e0 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61  yload - pPage->a
271f0 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73  Data) > (pBt->us
27200 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d  ableSize - pCur-
27210 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b  >info.nLocal) ){
27220 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
27230 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
27240 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
27250 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
27260 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a  rror.  The.    *
27270 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  * conditional ab
27280 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20  ove is really:. 
27290 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f     **    &aPaylo
272a0 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
272b0 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e  ocal] > &pPage->
272c0 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  aData[pBt->usabl
272d0 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75  eSize].    ** bu
272e0 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f  t is recast into
272f0 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72   its current for
27300 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67  m to avoid integ
27310 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62  er overflow prob
27320 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lems.    */.    
27330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
27340 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
27350 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  );.  }..  /* Che
27360 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
27370 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
27380 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
27390 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
273a0 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
273b0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
273c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
273d0 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
273e0 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
273f0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
27400 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
27410 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
27420 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
27430 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
27440 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
27450 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61  Buf, a, eOp, pPa
27460 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
27470 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
27480 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
27490 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
274a0 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
274b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
274c0 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28  cal;.  }...  if(
274d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
274e0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63  & amt>0 ){.    c
274f0 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a  onst u32 ovflSiz
27500 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
27510 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74  ize - 4;  /* Byt
27520 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f  es content per o
27530 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  vfl page */.    
27540 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a  Pgno nextPage;..
27550 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67      nextPage = g
27560 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61  et4byte(&aPayloa
27570 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
27580 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  cal]);..    /* I
27590 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  f the BtCursor.a
275a0 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e  Overflow[] has n
275b0 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ot been allocate
275c0 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e  d, allocate it n
275d0 6f 77 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ow..    **.    *
275e0 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  * The aOverflow[
275f0 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65 64  ] array is sized
27600 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   at one entry fo
27610 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
27620 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74  page.    ** in t
27630 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  he overflow chai
27640 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  n. The page numb
27650 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
27660 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
27670 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69  .    ** stored i
27680 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20  n aOverflow[0], 
27690 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
276a0 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
276b0 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a  ow[] array.    *
276c0 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74  * means "not yet
276d0 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63   known" (the cac
276e0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
276f0 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
27700 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
27710 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
27720 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a  alidOvfl)==0 ){.
27730 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20        int nOvfl 
27740 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  = (pCur->info.nP
27750 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66  ayload-pCur->inf
27760 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a  o.nLocal+ovflSiz
27770 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20  e-1)/ovflSize;. 
27780 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
27790 4f 76 65 72 66 6c 6f 77 3d 3d 30 0a 20 20 20 20  Overflow==0.    
277a0 20 20 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74     || nOvfl*(int
277b0 29 73 69 7a 65 6f 66 28 50 67 6e 6f 29 20 3e 20  )sizeof(Pgno) > 
277c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
277d0 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
277e0 77 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  w).      ){.    
277f0 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d      Pgno *aNew =
27800 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52   (Pgno*)sqlite3R
27810 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
27820 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
27830 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a  low, nOvfl*2*siz
27840 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20  eof(Pgno).      
27850 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
27860 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   aNew==0 ){.    
27870 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
27880 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
27890 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
278a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
278b0 4f 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b  Overflow = aNew;
278c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
278d0 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
278e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
278f0 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66   0, nOvfl*sizeof
27900 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70  (Pgno));.      p
27910 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
27920 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b   BTCF_ValidOvfl;
27930 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27940 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
27950 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
27960 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
27970 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
27980 20 20 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66        ** entry f
27990 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
279a0 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
279b0 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
279c0 69 70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65  ip.      ** dire
279d0 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
279e0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
279f0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
27a00 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20  ffset/ovflSize] 
27a10 29 7b 0a 20 20 20 20 20 20 20 20 69 49 64 78 20  ){.        iIdx 
27a20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
27a30 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  ze);.        nex
27a40 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
27a50 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
27a60 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
27a70 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
27a80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27a90 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
27aa0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
27ab0 6d 74 3e 30 20 29 3b 0a 20 20 20 20 77 68 69 6c  mt>0 );.    whil
27ac0 65 28 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20  e( nextPage ){. 
27ad0 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
27ae0 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
27af0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
27b00 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
27b10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
27b20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27b30 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  x]==0.          
27b40 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76      || pCur->aOv
27b50 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65  erflow[iIdx]==ne
27b60 78 74 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  xtPage.         
27b70 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
27b80 44 42 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  DB );.      pCur
27b90 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
27ba0 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  ] = nextPage;.. 
27bb0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
27bc0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
27bd0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
27be0 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
27bf0 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
27c00 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
27c10 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
27c20 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
27c30 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
27c40 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
27c50 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
27c60 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
27c70 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
27c80 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
27c90 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
27ca0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
27cb0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
27cc0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
27cd0 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
27ce0 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
27cf0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
27d00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
27d10 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c  ert( pCur->curFl
27d20 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
27d30 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Ovfl );.        
27d40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42  assert( pCur->pB
27d50 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64  tree->db==pBt->d
27d60 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b );.        if(
27d70 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27d80 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
27d90 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
27da0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
27db0 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
27dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27dd0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
27de0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
27df0 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
27e00 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
27e10 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
27e20 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
27e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27e40 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
27e50 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
27e60 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
27e70 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
27e80 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
27e90 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
27ea0 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
27eb0 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
27ec0 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
27ed0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
27ee0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
27ef0 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
27f00 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 20 20  ite3_file *fd;  
27f10 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d      /* File from
27f20 20 77 68 69 63 68 20 74 6f 20 64 6f 20 64 69 72   which to do dir
27f30 65 63 74 20 6f 76 65 72 66 6c 6f 77 20 72 65 61  ect overflow rea
27f40 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  d */.#endif.    
27f50 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
27f60 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
27f70 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
27f80 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
27f90 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
27fa0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
27fb0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
27fc0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
27fd0 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
27fe0 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
27ff0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
28000 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
28010 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
28020 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
28030 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
28040 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
28050 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
28060 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
28070 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
28080 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
28090 20 33 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20   3) there is no 
280a0 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73  open write-trans
280b0 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20  action, and.    
280c0 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20      **   4) the 
280d0 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
280e0 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
280f0 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
28100 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
28110 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20  the WAL file.   
28120 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20       **   6) at 
28130 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
28140 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
28150 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
28160 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
28170 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
28180 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
28190 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
281a0 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
281b0 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
281c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
281d0 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
281e0 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
281f0 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
28200 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
28210 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
28220 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
28230 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
28240 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
28250 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28260 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20     if( eOp==0   
28270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
282a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
282b0 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282e0 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
282f0 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e        && pBt->in
28300 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
28310 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20 20  NS_READ         
28320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
28330 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  3) */.         &
28340 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50  & (fd = sqlite3P
28350 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
28360 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73  ager))->pMethods
28370 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
28380 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71          && 0==sq
28390 6c 69 74 65 33 50 61 67 65 72 55 73 65 57 61 6c  lite3PagerUseWal
283a0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
283b0 78 74 50 61 67 65 29 20 20 20 20 20 20 20 2f 2a  xtPage)       /*
283c0 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (5) */.        
283d0 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70   && &pBuf[-4]>=p
283e0 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20 20  BufStart        
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f         /* (6) */
28410 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
28420 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b 34        u8 aSave[4
28430 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  ];.          u8 
28440 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b  *aWrite = &pBuf[
28450 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61  -4];.          a
28460 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70  ssert( aWrite>=p
28470 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20 20  BufStart );     
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36      /* due to (6
284a0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
284b0 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
284c0 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
284d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
284e0 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
284f0 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
28500 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
28510 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
28520 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
28530 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
28540 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
28550 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
28560 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
28570 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
28580 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
28590 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
285a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
285b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
285c0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
285d0 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20  age, &pDbPage,. 
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65 4f               (eO
285f0 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  p==0 ? PAGER_GET
28600 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
28610 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
28620 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
28630 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28640 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
28650 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
28660 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
28670 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
28680 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
28690 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
286a0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
286b0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
286c0 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
286d0 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
286e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
286f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
28700 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
28710 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
28720 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
28730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28740 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
28750 20 20 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20       if( amt==0 
28760 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
28770 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
28780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
28790 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
287a0 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20      iIdx++;.    
287b0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
287c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
287d0 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76  t>0 ){.    /* Ov
287e0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64  erflow chain end
287f0 73 20 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f  s prematurely */
28800 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28810 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
28820 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
28830 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28840 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
28850 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74  he payload for t
28860 68 65 20 72 6f 77 20 61 74 20 77 68 69 63 68 20  he row at which 
28870 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
28880 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
28890 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74   pointing.  "amt
288a0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
288b0 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f  transferred into
288c0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
288d0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
288e0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
288f0 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62 65 20  .** pCur can be 
28900 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69 74 68  pointing to eith
28910 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20 61 6e  er a table or an
28920 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a   index b-tree..*
28930 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f  * If pointing to
28940 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2c 20   a table btree, 
28950 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  then the content
28960 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64   section is read
28970 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20 69 73  .  If.** pCur is
28980 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20   pointing to an 
28990 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74 68 65  index b-tree the
289a0 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74 69 6f  n the key sectio
289b0 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  n is read..**.**
289c0 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65   For sqlite3Btre
289d0 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68 65 20  ePayload(), the 
289e0 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
289f0 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
28a00 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
28a10 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20 74 68   valid row in th
28a20 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20 73 71  e table.  For sq
28a30 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28a40 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68 65 0a  dChecked(), the.
28a50 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  ** cursor might 
28a60 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69  be invalid or mi
28a70 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  ght need to be r
28a80 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 62  estored before b
28a90 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  eing read..**.**
28aa0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
28ab0 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
28ac0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
28ad0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
28ae0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
28af0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
28b00 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
28b10 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
28b20 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
28b30 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
28b40 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
28b50 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ad(BtCursor *pCu
28b60 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
28b70 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
28b80 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  uf){.  assert( c
28b90 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
28ba0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28bb0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
28bc0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
28bd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28be0 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75  >iPage>=0 && pCu
28bf0 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
28c00 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
28c10 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
28c20 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63  l );.  return ac
28c30 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
28c40 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
28c50 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
28c60 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Buf, 0);.}../*.*
28c70 2a 20 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f  * This variant o
28c80 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  f sqlite3BtreePa
28c90 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76  yload() works ev
28ca0 65 6e 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  en if the cursor
28cb0 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74   has not.** in t
28cc0 68 65 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  he CURSOR_VALID 
28cd0 73 74 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e  state.  It is on
28ce0 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20 73  ly used by the s
28cf0 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64  qlite3_blob_read
28d00 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e  ().** interface.
28d10 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
28d20 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
28d30 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
28d40 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65  OINLINE int acce
28d50 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64  ssPayloadChecked
28d60 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
28d70 75 72 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74  ur,.  u32 offset
28d80 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76  ,.  u32 amt,.  v
28d90 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69  oid *pBuf.){.  i
28da0 6e 74 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43  nt rc;.  if ( pC
28db0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
28dc0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
28dd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28de0 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73  ABORT;.  }.  ass
28df0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
28e00 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
28e10 0a 20 20 72 63 20 3d 20 62 74 72 65 65 52 65 73  .  rc = btreeRes
28e20 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
28e30 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  on(pCur);.  retu
28e40 72 6e 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63  rn rc ? rc : acc
28e50 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
28e60 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
28e70 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71  uf, 0);.}.int sq
28e80 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
28e90 64 43 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f  dChecked(BtCurso
28ea0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
28eb0 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
28ec0 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28  id *pBuf){.  if(
28ed0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28ee0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
28ef0 20 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f     assert( curso
28f00 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
28f10 75 72 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ur) );.    retur
28f20 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
28f30 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
28f40 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d  t, pBuf, 0);.  }
28f50 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
28f60 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68   accessPayloadCh
28f70 65 63 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73  ecked(pCur, offs
28f80 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a  et, amt, pBuf);.
28f90 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
28fa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
28fb0 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  BLOB */../*.** R
28fc0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
28fd0 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
28fe0 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
28ff0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
29000 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
29010 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
29020 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
29030 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
29040 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
29050 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70   index btrees (p
29060 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29  Page->intKey==0)
29070 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61   and is the data
29080 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74   for.** table bt
29090 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
290a0 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d  Key==1). The num
290b0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
290c0 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79  available.** key
290d0 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
290e0 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
290f0 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
29100 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74  the value.** ret
29110 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
29120 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  e a valid pointe
29130 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
29140 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
29150 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
29160 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
29170 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
29180 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
29190 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
291a0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
291b0 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
291c0 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
291d0 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
291e0 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
291f0 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
29200 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
29210 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
29220 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
29230 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
29240 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
29250 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
29260 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
29270 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
29280 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
29290 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
292a0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
292b0 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
292c0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
292d0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
292e0 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
292f0 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
29300 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
29310 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
29320 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
29330 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
29340 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
29350 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
29360 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
29370 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
29380 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66  ic const void *f
29390 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
293a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
293b0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
293c0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
293d0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
293e0 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20    u32 *pAmt     
293f0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
29400 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
29410 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
29420 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  re */.){.  int a
29430 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  mt;.  assert( pC
29440 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
29450 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
29460 3e 70 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72  >pPage);.  asser
29470 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
29480 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29490 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
294a0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
294b0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
294c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
294d0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
294e0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
294f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29500 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ix<pCur->pPage->
29510 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
29520 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
29530 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ize>0 );.  asser
29540 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
29550 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61  ayload>pCur->pPa
29560 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  ge->aData || COR
29570 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
29580 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
29590 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70  pPayload<pCur->p
295a0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c  Page->aDataEnd |
295b0 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20  |CORRUPT_DB);.  
295c0 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  amt = pCur->info
295d0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61  .nLocal;.  if( a
295e0 6d 74 3e 28 69 6e 74 29 28 70 43 75 72 2d 3e 70  mt>(int)(pCur->p
295f0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d  Page->aDataEnd -
29600 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
29610 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20  load) ){.    /* 
29620 54 68 65 72 65 20 69 73 20 74 6f 6f 20 6c 69 74  There is too lit
29630 74 6c 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  tle space on the
29640 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 65 78   page for the ex
29650 70 65 63 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20  pected amount.  
29660 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f    ** of local co
29670 6e 74 65 6e 74 2e 20 44 61 74 61 62 61 73 65 20  ntent. Database 
29680 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
29690 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
296a0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
296b0 20 20 61 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28    amt = MAX(0, (
296c0 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65  int)(pCur->pPage
296d0 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75  ->aDataEnd - pCu
296e0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
296f0 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20  ));.  }.  *pAmt 
29700 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20 20 72 65  = (u32)amt;.  re
29710 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
29720 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
29730 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
29740 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
29750 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
29760 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
29770 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
29780 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
29790 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
297a0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
297b0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
297c0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
297d0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
297e0 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
297f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
29800 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
29810 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
29820 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
29830 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
29840 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
29850 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
29860 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
29870 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
29880 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
29890 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
298a0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
298b0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
298c0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
298d0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
298e0 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
298f0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
29900 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
29910 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
29920 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
29930 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
29940 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
29950 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
29960 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
29970 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
29980 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
29990 50 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43  PayloadFetch(BtC
299a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
299b0 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72   *pAmt){.  retur
299c0 6e 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  n fetchPayload(p
299d0 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a  Cur, pAmt);.}...
299e0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
299f0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
29a00 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
29a10 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
29a20 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
29a30 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
29a40 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
29a50 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20   move to..**.** 
29a60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
29a70 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52  turns SQLITE_COR
29a80 52 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65  RUPT if the page
29a90 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69  -header flags fi
29aa0 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65  eld of.** the ne
29ab0 77 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65  w child page doe
29ac0 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
29ad0 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74  flags field of t
29ae0 68 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a  he parent (i.e..
29af0 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20  ** if an intkey 
29b00 70 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20  page appears to 
29b10 62 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  be the parent of
29b20 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61   a non-intkey pa
29b30 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76  ge, or.** vice-v
29b40 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ersa)..*/.static
29b50 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64   int moveToChild
29b60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
29b70 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20   u32 newPgno){. 
29b80 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
29b90 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61   pCur->pBt;..  a
29ba0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
29bb0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29bc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29bd0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29be0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
29bf0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
29c00 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
29c10 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
29c20 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
29c30 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  );.  if( pCur->i
29c40 50 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f  Page>=(BTCURSOR_
29c50 4d 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a  MAX_DEPTH-1) ){.
29c60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29c70 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
29c80 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f    }.  pCur->info
29c90 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
29ca0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
29cb0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
29cc0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
29cd0 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
29ce0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
29cf0 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d  Cur->ix;.  pCur-
29d00 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29d10 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61  age] = pCur->pPa
29d20 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  ge;.  pCur->ix =
29d30 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67   0;.  pCur->iPag
29d40 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 67 65  e++;.  return ge
29d50 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
29d60 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72  , newPgno, &pCur
29d70 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2c 20 70  ->pPage, pCur, p
29d80 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
29d90 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  gs);.}..#ifdef S
29da0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
29db0 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
29dc0 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
29dd0 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
29de0 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
29df0 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
29e00 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
29e10 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
29e20 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
29e30 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
29e40 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
29e50 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
29e60 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
29e70 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
29e80 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
29e90 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
29ea0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
29eb0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
29ec0 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
29ed0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
29ee0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
29ef0 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
29f00 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
29f10 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52  hild){.  if( COR
29f20 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
29f30 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74  ;  /* The condit
29f40 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f  ions tested belo
29f50 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  w might not be t
29f60 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rue.            
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f80 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
29f90 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73  database */.  as
29fa0 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
29fb0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
29fc0 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
29fd0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
29fe0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
29ff0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
2a000 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
2a010 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
2a020 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2a030 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
2a040 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
2a050 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
2a060 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
2a070 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
2a080 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
2a090 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
2a0a0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2a0b0 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
2a0c0 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
2a0d0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
2a0e0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
2a0f0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
2a100 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
2a110 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
2a120 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
2a130 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
2a140 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
2a150 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
2a160 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
2a170 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
2a180 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
2a190 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
2a1a0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
2a1b0 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
2a1c0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2a1d0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c  ){.  MemPage *pL
2a1e0 65 61 66 3b 0a 20 20 61 73 73 65 72 74 28 20 63  eaf;.  assert( c
2a1f0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2a200 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2a210 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2a220 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2a230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a240 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  r->iPage>0 );.  
2a250 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2a260 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 50  age );.  assertP
2a270 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20  arentIndex(.    
2a280 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a290 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
2a2a0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2a2b0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
2a2c0 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e     pCur->pPage->
2a2d0 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74  pgno.  );.  test
2a2e0 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64  case( pCur->aiId
2a2f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2a300 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   > pCur->apPage[
2a310 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e  pCur->iPage-1]->
2a320 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d  nCell );.  pCur-
2a330 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2a340 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2a350 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2a360 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2a370 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69  Ovfl);.  pCur->i
2a380 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
2a390 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a  pCur->iPage-1];.
2a3a0 20 20 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e    pLeaf = pCur->
2a3b0 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70  pPage;.  pCur->p
2a3c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2a3d0 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67  age[--pCur->iPag
2a3e0 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e];.  releasePag
2a3f0 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b  eNotNull(pLeaf);
2a400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
2a410 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69  he cursor to poi
2a420 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70  nt to the root p
2a430 61 67 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65  age of its b-tre
2a440 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  e structure..**.
2a450 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  ** If the table 
2a460 68 61 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f  has a virtual ro
2a470 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
2a480 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
2a490 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f  d to point.** to
2a4a0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
2a4b0 74 20 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f  t page instead o
2a4c0 66 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f  f the actual roo
2a4d0 74 20 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20  t page. A table 
2a4e0 68 61 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c  has a.** virtual
2a4f0 20 72 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20   root page when 
2a500 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
2a510 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  page contains no
2a520 20 63 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a   cells and a .**
2a530 20 73 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61   single child pa
2a540 67 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  ge. This can onl
2a550 79 20 68 61 70 70 65 6e 20 77 69 74 68 20 74 68  y happen with th
2a560 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61  e table rooted a
2a570 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20  t page 1..**.** 
2a580 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 73 74  If the b-tree st
2a590 72 75 63 74 75 72 65 20 69 73 20 65 6d 70 74 79  ructure is empty
2a5a0 2c 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  , the cursor sta
2a5b0 74 65 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a  te is set to .**
2a5c0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
2a5d0 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65  and this routine
2a5e0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
2a5f0 45 4d 50 54 59 2e 20 4f 74 68 65 72 77 69 73 65  EMPTY. Otherwise
2a600 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  ,.** the cursor 
2a610 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
2a620 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  to the first cel
2a630 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65  l located on the
2a640 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72   root.** (or vir
2a650 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20  tual root) page 
2a660 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73  and the cursor s
2a670 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
2a680 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
2a690 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
2a6a0 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63  ion returns succ
2a6b0 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79  essfully, it may
2a6c0 20 62 65 20 61 73 73 75 6d 65 64 20 74 68 61 74   be assumed that
2a6d0 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61   the.** page-hea
2a6e0 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61  der flags indica
2a6f0 74 65 20 74 68 61 74 20 74 68 65 20 5b 76 69 72  te that the [vir
2a700 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20  tual] root-page 
2a710 69 73 20 74 68 65 20 65 78 70 65 63 74 65 64 20  is the expected 
2a720 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72  .** kind of b-tr
2a730 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66  ee page (i.e. if
2a740 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68   when opening th
2a750 65 20 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c  e cursor the cal
2a760 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73  ler did not.** s
2a770 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f  pecify a KeyInfo
2a780 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
2a790 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
2a7a0 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44   to 0x05 or 0x0D
2a7b0 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
2a7c0 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20  a table b-tree, 
2a7d0 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72  or if the caller
2a7e0 20 64 69 64 20 73 70 65 63 69 66 79 20 61 20 4b   did specify a K
2a7f0 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63  eyInfo .** struc
2a800 74 75 72 65 20 74 68 65 20 66 6c 61 67 73 20 62  ture the flags b
2a810 79 74 65 20 69 73 20 73 65 74 20 74 6f 20 30 78  yte is set to 0x
2a820 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69  02 or 0x0A, indi
2a830 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a  cating an index.
2a840 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73  ** b-tree)..*/.s
2a850 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
2a860 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Root(BtCursor *p
2a870 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2a880 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  *pRoot;.  int rc
2a890 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2a8a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2a8b0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2a8c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
2a8d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
2a8e0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2a8f0 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
2a900 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
2a910 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2a920 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
2a930 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
2a940 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
2a950 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
2a960 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3c  ( pCur->eState <
2a970 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2a980 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61  EEK || pCur->iPa
2a990 67 65 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ge<0 );.  assert
2a9a0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2a9b0 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67  >0 || pCur->iPag
2a9c0 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  e<0 );..  if( pC
2a9d0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a  ur->iPage>=0 ){.
2a9e0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2a9f0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  age ){.      rel
2aa00 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
2aa10 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
2aa20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d 70 43 75      while( --pCu
2aa30 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20  r->iPage ){.    
2aa40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
2aa50 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
2aa60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2aa70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2aa80 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70   pCur->pPage = p
2aa90 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
2aaa0 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f        goto skip_
2aab0 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  init;.    }.  }e
2aac0 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67  lse if( pCur->pg
2aad0 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  noRoot==0 ){.   
2aae0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2aaf0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2ab00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ab10 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65  E_EMPTY;.  }else
2ab20 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
2ab30 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20  ur->iPage==(-1) 
2ab40 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
2ab50 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
2ab60 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
2ab70 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65       if( pCur->e
2ab80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
2ab90 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ULT ){.        a
2aba0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2abb0 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b  pNext!=SQLITE_OK
2abc0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   );.        retu
2abd0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
2abe0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2abf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
2ac00 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
2ac10 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67      }.    rc = g
2ac20 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
2ac30 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
2ac40 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
2ac50 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20   &pCur->pPage,. 
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
2ac80 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
2ac90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2aca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
2acb0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2acc0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2acd0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ace0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
2acf0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
2ad00 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20  ur->curIntKey = 
2ad10 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
2ad20 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74  Key;.  }.  pRoot
2ad30 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2ad40 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
2ad50 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
2ad60 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
2ad70 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
2ad80 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
2ad90 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
2ada0 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
2adb0 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
2adc0 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
2add0 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
2ade0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
2adf0 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
2ae00 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
2ae10 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
2ae20 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
2ae30 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
2ae40 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
2ae50 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
2ae60 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
2ae70 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
2ae80 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
2ae90 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
2aea0 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
2aeb0 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
2aec0 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
2aed0 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
2aee0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2aef0 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
2af00 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
2af10 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
2af20 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
2af30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2af40 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
2af50 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
2af60 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
2af70 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
2af80 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
2af90 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
2afa0 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
2afb0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
2afc0 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
2afd0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
2afe0 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
2aff0 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
2b000 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2b010 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
2b020 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2b030 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
2b040 45 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  E(pCur->pPage);.
2b050 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20    }..skip_init: 
2b060 20 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30   .  pCur->ix = 0
2b070 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
2b080 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
2b090 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
2b0a0 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2b0b0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2b0c0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70  ValidOvfl);..  p
2b0d0 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
2b0e0 67 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d  ge;.  if( pRoot-
2b0f0 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
2b100 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2b110 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d  URSOR_VALID;.  }
2b120 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d  else if( !pRoot-
2b130 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
2b140 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69  o subpage;.    i
2b150 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d  f( pRoot->pgno!=
2b160 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
2b170 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
2b180 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65      subpage = ge
2b190 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61  t4byte(&pRoot->a
2b1a0 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f  Data[pRoot->hdrO
2b1b0 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70  ffset+8]);.    p
2b1c0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2b1d0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2b1e0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2b1f0 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b  (pCur, subpage);
2b200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43  .  }else{.    pC
2b210 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2b220 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2b230 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50   rc = SQLITE_EMP
2b240 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  TY;.  }.  return
2b250 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
2b260 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2b270 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
2b280 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
2b290 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
2b2a0 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
2b2b0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2b2c0 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
2b2d0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
2b2e0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
2b2f0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
2b300 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
2b310 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2b320 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2b330 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
2b340 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2b350 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
2b360 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b370 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
2b380 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2b390 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2b3a0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2b3b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2b3c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2b3d0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
2b3e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2b3f0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
2b400 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a  pPage)->leaf ){.
2b410 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2b420 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  ->ix<pPage->nCel
2b430 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  l );.    pgno = 
2b440 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2b450 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2b460 78 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  x));.    rc = mo
2b470 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2b480 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
2b490 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b4a0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2b4b0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67   down to the rig
2b4c0 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ht-most leaf ent
2b4d0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2b4e0 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20  * page to which 
2b4f0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2b500 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63  pointing.  Notic
2b510 65 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  e the difference
2b520 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65  .** between move
2b530 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64  ToLeftmost() and
2b540 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2b550 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ().  moveToLeftm
2b560 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2b570 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74  he left-most ent
2b580 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2b590 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d  entry* whereas m
2b5a0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2b5b0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69  .** finds the ri
2b5c0 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62  ght-most entry b
2b5d0 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65  eneath the *page
2b5e0 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67  *..**.** The rig
2b5f0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73  ht-most entry is
2b600 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2b610 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20  e largest key - 
2b620 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20  the last.** key 
2b630 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
2b640 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2b650 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  t moveToRightmos
2b660 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2b670 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  ){.  Pgno pgno;.
2b680 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b690 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20  E_OK;.  MemPage 
2b6a0 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  *pPage = 0;..  a
2b6b0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2b6c0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2b6d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b6e0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b6f0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2b700 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
2b710 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
2b720 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
2b730 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2b740 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2b750 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2b760 70 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65  pCur->ix = pPage
2b770 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20  ->nCell;.    rc 
2b780 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2b790 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69  ur, pgno);.    i
2b7a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2b7b0 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  c;.  }.  pCur->i
2b7c0 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  x = pPage->nCell
2b7d0 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  -1;.  assert( pC
2b7e0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2b7f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  0 );.  assert( (
2b800 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2b810 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2b820 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
2b830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2b840 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2b850 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e   to the first en
2b860 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2b870 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
2b880 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
2b890 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f  s.  Set *pRes to
2b8a0 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72   0 if the cursor
2b8b0 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73   actually points
2b8c0 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   to something.**
2b8d0 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f   or set *pRes to
2b8e0 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20   1 if the table 
2b8f0 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
2b900 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72   sqlite3BtreeFir
2b910 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2b920 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2b930 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2b940 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2b950 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2b960 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b970 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
2b980 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
2b990 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
2b9a0 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2b9b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2b9c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2b9d0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2b9e0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2b9f0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2ba00 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
2ba10 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
2ba20 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
2ba30 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61  E_EMPTY ){.    a
2ba40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2ba50 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2ba60 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
2ba70 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  0 );.    *pRes =
2ba80 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   1;.    rc = SQL
2ba90 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
2baa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2bab0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2bac0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 63 75  is a no-op if cu
2bad0 72 73 6f 72 20 70 43 75 72 20 64 6f 65 73 20 6e  rsor pCur does n
2bae0 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61  ot point to a va
2baf0 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20 4f 74 68 65  lid row..** Othe
2bb00 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20 69  rwise, if pCur i
2bb10 73 20 76 61 6c 69 64 2c 20 63 6f 6e 66 69 67 75  s valid, configu
2bb20 72 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68  re it so that th
2bb30 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 2a  e next call to.*
2bb40 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  * sqlite3BtreeNe
2bb50 78 74 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  xt() is a no-op.
2bb60 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
2bb70 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
2bb80 4e 43 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  NC.void sqlite3B
2bb90 74 72 65 65 53 6b 69 70 4e 65 78 74 28 42 74 43  treeSkipNext(BtC
2bba0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2bbb0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2bbc0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2bbd0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2bbe0 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50  te = CURSOR_SKIP
2bbf0 4e 45 58 54 3b 0a 20 20 20 20 70 43 75 72 2d 3e  NEXT;.    pCur->
2bc00 73 6b 69 70 4e 65 78 74 20 3d 20 31 3b 0a 20 20  skipNext = 1;.  
2bc10 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
2bc20 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
2bc30 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20 4d 6f 76 65  FUNC */../* Move
2bc40 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2bc50 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2bc60 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2bc70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2bc80 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2bc90 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2bca0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2bcb0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2bcc0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2bcd0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2bce0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2bcf0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2bd00 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2bd10 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2bd20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2bd30 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2bd40 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2bd50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2bd60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2bd70 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2bd80 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2bd90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2bda0 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2bdb0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2bdc0 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2bdd0 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2bde0 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2bdf0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2be00 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2be10 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2be20 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2be30 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2be40 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2be50 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2be60 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2be70 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2be80 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2be90 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2bea0 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2beb0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2bec0 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2bed0 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2bee0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2bef0 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2bf00 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2bf10 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2bf20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bf30 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d  ix==pCur->pPage-
2bf40 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
2bf50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2bf60 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  age->leaf );.#en
2bf70 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
2bf80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2bf90 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2bfa0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2bfb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bfc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2bfd0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2bfe0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52  VALID );.    *pR
2bff0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  es = 0;.    rc =
2c000 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2c010 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2c020 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c030 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
2c040 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
2c050 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Last;.    }else{
2c060 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
2c070 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2c080 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  tLast;.    }.  }
2c090 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2c0a0 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2c0b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2c0c0 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2c0d0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2c0e0 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
2c0f0 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
2c100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2c110 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c120 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2c130 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
2c140 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
2c150 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
2c160 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
2c170 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
2c180 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
2c190 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
2c1a0 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
2c1b0 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
2c1c0 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
2c1d0 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
2c1e0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
2c1f0 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
2c200 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
2c210 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
2c220 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
2c230 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
2c240 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
2c250 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
2c260 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
2c270 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
2c280 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
2c290 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
2c2a0 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
2c2b0 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
2c2c0 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
2c2d0 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
2c2e0 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
2c2f0 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
2c300 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
2c310 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
2c320 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
2c330 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
2c340 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
2c350 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
2c360 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2c370 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
2c380 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
2c390 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
2c3a0 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
2c3b0 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
2c3c0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2c3d0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
2c3e0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2c3f0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2c400 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2c410 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2c420 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
2c430 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2c440 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
2c450 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
2c460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c470 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
2c480 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
2c490 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
2c4a0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
2c4b0 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
2c4c0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2c4d0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2c4e0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2c4f0 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
2c500 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
2c510 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2c520 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
2c530 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2c540 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2c550 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2c560 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2c570 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
2c580 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
2c590 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64  y..**.** For ind
2c5a0 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70  ex tables, the p
2c5b0 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66  IdxKey->eqSeen f
2c5c0 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31  ield is set to 1
2c5d0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69   if there.** exi
2c5e0 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  sts an entry in 
2c5f0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65  the table that e
2c600 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70  xactly matches p
2c610 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74  IdxKey.  .*/.int
2c620 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2c630 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
2c640 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
2c650 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2c660 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
2c670 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
2c680 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
2c690 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
2c6a0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
2c6b0 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
2c6c0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2c6d0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
2c6e0 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
2c6f0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
2c700 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
2c710 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
2c720 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
2c730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c740 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
2c750 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
2c760 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f    int rc;.  Reco
2c770 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72  rdCompare xRecor
2c780 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73  dCompare;..  ass
2c790 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2c7a0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2c7b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2c7c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2c7d0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2c7e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2c7f0 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
2c800 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
2c810 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
2c820 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  nfo==0) );.  ass
2c830 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2c840 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2c850 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  || (pIdxKey==0)=
2c860 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  =(pCur->curIntKe
2c870 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  y!=0) );..  /* I
2c880 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2c890 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
2c8a0 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
2c8b0 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
2c8c0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
2c8d0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
2c8e0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
2c8f0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
2c900 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26  pIdxKey==0.   &&
2c910 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2c920 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
2c930 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c940 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2c950 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  !=0.  ){.    if(
2c960 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2c970 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2c980 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2c990 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c9a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2c9b0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2c9c0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2c9d0 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2c9e0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
2c9f0 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Last)!=0 ){.    
2ca00 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2ca10 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2ca20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2ca30 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  }.      /* If th
2ca40 65 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20  e requested key 
2ca50 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  is one more than
2ca60 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65   the previous ke
2ca70 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  y, then.      **
2ca80 20 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72   try to get ther
2ca90 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42  e using sqlite3B
2caa0 74 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65  treeNext() rathe
2cab0 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20  r than a full.  
2cac0 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65      ** binary se
2cad0 61 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61  arch.  This is a
2cae0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  n optimization o
2caf0 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63  nly.  The correc
2cb00 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a  t answer.      *
2cb10 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69  * is still obtai
2cb20 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73  ned without this
2cb30 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69   case, only a li
2cb40 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c  ttle more slowel
2cb50 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  y */.      if( p
2cb60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31  Cur->info.nKey+1
2cb70 3d 3d 69 6e 74 4b 65 79 20 26 26 20 21 70 43 75  ==intKey && !pCu
2cb80 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2cb90 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2cba0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
2cbb0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2cbc0 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  pCur, 0);.      
2cbd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cbe0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2cbf0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
2cc00 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
2cc10 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2cc20 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
2cc30 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2cc40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2cc50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2cc60 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2cc70 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
2cc80 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cc90 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  E_OK;.        }e
2cca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2ccb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2ccc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ccd0 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64  }.  }..  if( pId
2cce0 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63  xKey ){.    xRec
2ccf0 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c  ordCompare = sql
2cd00 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
2cd10 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  are(pIdxKey);.  
2cd20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f    pIdxKey->errCo
2cd30 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  de = 0;.    asse
2cd40 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  rt( pIdxKey->def
2cd50 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20  ault_rc==1 .    
2cd60 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2cd70 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a  >default_rc==0 .
2cd80 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2cd90 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2cda0 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  =-1.    );.  }el
2cdb0 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43  se{.    xRecordC
2cdc0 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41  ompare = 0; /* A
2cdd0 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65  ll keys are inte
2cde0 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72  gers */.  }..  r
2cdf0 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2ce00 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
2ce10 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
2ce20 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20  LITE_EMPTY ){.  
2ce30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ce40 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2ce50 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
2ce60 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
2ce70 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
2ce80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ce90 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OK;.    }.    re
2cea0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2ceb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2cec0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
2ced0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49  pCur->pPage->isI
2cee0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
2cef0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2cf00 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2cf10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2cf20 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20  Page->nCell > 0 
2cf30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2cf40 72 2d 3e 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70  r->iPage==0 || p
2cf50 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
2cf60 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75  intKey==pCur->cu
2cf70 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73  rIntKey );.  ass
2cf80 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
2cf90 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
2cfa0 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
2cfb0 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20    int lwr, upr, 
2cfc0 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f  idx, c;.    Pgno
2cfd0 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
2cfe0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2cff0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 75  ur->pPage;.    u
2d000 38 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  8 *pCell;       
2d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d020 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2d030 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e   current cell in
2d040 20 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f   pPage */..    /
2d050 2a 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d  * pPage->nCell m
2d060 75 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ust be greater t
2d070 68 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69  han zero. If thi
2d080 73 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61  s is the root-pa
2d090 67 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  ge.    ** the cu
2d0a0 72 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20  rsor would have 
2d0b0 62 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f  been INVALID abo
2d0c0 76 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28  ve and this for(
2d0d0 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20  ;;) loop.    ** 
2d0e0 6e 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73  not run. If this
2d0f0 20 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74   is not the root
2d100 2d 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20  -page, then the 
2d110 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f  moveToChild() ro
2d120 75 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75  utine.    ** wou
2d130 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
2d140 64 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72  detected db corr
2d150 75 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c  uption. Similarl
2d160 79 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20  y, pPage must.  
2d170 20 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68    ** be the righ
2d180 74 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72  t kind (index or
2d190 20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65   table) of b-tre
2d1a0 65 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  e page. Otherwis
2d1b0 65 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54  e.    ** a moveT
2d1c0 6f 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65  oChild() or move
2d1d0 54 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f  ToRoot() call wo
2d1e0 75 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65  uld have detecte
2d1f0 64 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  d corruption.  *
2d200 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2d210 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
2d220 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d230 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78  e->intKey==(pIdx
2d240 4b 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c  Key==0) );.    l
2d250 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
2d260 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2d270 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69  ;.    assert( bi
2d280 61 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69  asRight==0 || bi
2d290 61 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20  asRight==1 );.  
2d2a0 20 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d    idx = upr>>(1-
2d2b0 62 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69  biasRight); /* i
2d2c0 64 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f  dx = biasRight ?
2d2d0 20 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29   upr : (lwr+upr)
2d2e0 2f 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d  /2; */.    pCur-
2d2f0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2d300 20 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43      if( xRecordC
2d310 6f 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20  ompare==0 ){.   
2d320 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2d330 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
2d340 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  ;.        pCell 
2d350 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74  = findCellPastPt
2d360 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20  r(pPage, idx);. 
2d370 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
2d380 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
2d390 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
2d3a0 20 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c   0x80 <= *(pCell
2d3b0 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
2d3c0 20 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50     if( pCell>=pP
2d3d0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b  age->aDataEnd ){
2d3e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2d3f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2d400 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
2d410 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2d420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2d430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
2d440 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
2d450 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
2d460 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2d470 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a  llKey<intKey ){.
2d480 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2d490 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  idx+1;.         
2d4a0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20   if( lwr>upr ){ 
2d4b0 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d  c = -1; break; }
2d4c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2d4d0 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b  f( nCellKey>intK
2d4e0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2d4f0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2d500 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2d510 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72  pr ){ c = +1; br
2d520 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2d530 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d540 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
2d550 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ==intKey );.    
2d560 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
2d570 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2d580 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
2d590 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
2d5a0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
2d5b0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2d5c0 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79   moveto_next_lay
2d5d0 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  er;.          }e
2d5e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
2d5f0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2d600 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
2d610 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
2d620 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
2d630 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2d640 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
2d650 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
2d660 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2d670 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2d680 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d690 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d6b0 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
2d6c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
2d6d0 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
2d6e0 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
2d6f0 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20  +upr)/2; */.    
2d700 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2d710 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20       for(;;){.  
2d720 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b        int nCell;
2d730 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
2d740 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62   pCell cell in b
2d750 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ytes */.        
2d760 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2d770 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69  PastPtr(pPage, i
2d780 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  dx);..        /*
2d790 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
2d7a0 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
2d7b0 20 69 73 20 36 35 35 33 36 20 62 79 74 65 73 2e   is 65536 bytes.
2d7c0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
2d7d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2d7e0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
2d7f0 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
2d800 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
2d810 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
2d820 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73   ** page is less
2d830 20 74 68 61 6e 20 31 36 33 38 34 20 62 79 74 65   than 16384 byte
2d840 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f  s and may be sto
2d850 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
2d860 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
2d870 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
2d880 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
2d890 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
2d8a0 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
2d8b0 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
2d8c0 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
2d8d0 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
2d8e0 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
2d8f0 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
2d900 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
2d910 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
2d920 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
2d930 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
2d940 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
2d950 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
2d960 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2d970 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30   nCell = pCell[0
2d980 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ];.        if( n
2d990 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  Cell<=pPage->max
2d9a0 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a  1bytePayload ){.
2d9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
2d9c0 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
2d9d0 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
2d9e0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
2d9f0 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
2da00 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
2da10 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
2da20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
2da30 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2da40 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
2da50 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
2da60 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2da70 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31  e( pCell+nCell+1
2da80 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ==pPage->aDataEn
2da90 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  d );.          c
2daa0 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72   = xRecordCompar
2dab0 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29  e(nCell, (void*)
2dac0 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b  &pCell[1], pIdxK
2dad0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ey);.        }el
2dae0 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31  se if( !(pCell[1
2daf0 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20 20 20  ] & 0x80) .     
2db00 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d       && (nCell =
2db10 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c   ((nCell&0x7f)<<
2db20 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d  7) + pCell[1])<=
2db30 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a  pPage->maxLocal.
2db40 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
2db50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
2db60 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73  rd-size field is
2db70 20 61 20 32 20 62 79 74 65 20 76 61 72 69 6e 74   a 2 byte varint
2db80 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2db90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69  .          ** fi
2dba0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
2dbb0 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70  he main b-tree p
2dbc0 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  age.  */.       
2dbd0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65     testcase( pCe
2dbe0 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67  ll+nCell+2==pPag
2dbf0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
2dc00 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2dc10 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2dc20 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c  l, (void*)&pCell
2dc30 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  [2], pIdxKey);. 
2dc40 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2dc50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2dc60 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72  ecord flows over
2dc70 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   onto one or mor
2dc80 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
2dc90 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
2dca0 2a 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  * this case the 
2dcb0 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73  whole cell needs
2dcc0 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61   to be parsed, a
2dcd0 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
2dce0 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  d.          ** a
2dcf0 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nd accessPayload
2dd00 28 29 20 75 73 65 64 20 74 6f 20 72 65 74 72 69  () used to retri
2dd10 65 76 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  eve the record i
2dd20 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
2dd30 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f    ** buffer befo
2dd40 72 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  re VdbeRecordCom
2dd50 70 61 72 65 28 29 20 63 61 6e 20 62 65 20 63 61  pare() can be ca
2dd60 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20  lled. .         
2dd70 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   **.          **
2dd80 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
2dd90 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78  s corrupt, the x
2dda0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f  RecordCompare ro
2ddb0 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20  utine may read. 
2ddc0 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74           ** up t
2ddd0 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61  o two varints pa
2dde0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
2ddf0 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74  e buffer. An ext
2de00 72 61 20 31 38 20 0a 20 20 20 20 20 20 20 20 20  ra 18 .         
2de10 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64   ** bytes of pad
2de20 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65  ding is allocate
2de30 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
2de40 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20  the buffer in.  
2de50 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20          ** case 
2de60 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a  this happens.  *
2de70 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
2de80 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
2de90 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
2dea0 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
2deb0 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
2dec0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
2ded0 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
2dee0 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
2def0 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69  llBody, &pCur->i
2df00 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nfo);.          
2df10 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75  nCell = (int)pCu
2df20 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
2df30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
2df40 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f  ( nCell<0 );   /
2df50 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20 73 69  * True if key si
2df60 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f  ze is 2^32 or mo
2df70 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
2df80 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2df90 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69  =0 );  /* Invali
2dfa0 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38  d key size:  0x8
2dfb0 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20  0 0x80 0x00 */. 
2dfc0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2dfd0 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20  e( nCell==1 );  
2dfe0 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2dff0 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2e000 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x01 */.        
2e010 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2e020 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  l==2 );  /* Mini
2e030 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20  mum legal index 
2e040 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  key size */.    
2e050 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2e060 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
2e070 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2e080 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
2e090 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2e0a0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
2e0b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2e0c0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79          pCellKey
2e0d0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2e0e0 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20  ( nCell+18 );.  
2e0f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c          if( pCel
2e100 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lKey==0 ){.     
2e110 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2e120 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2e130 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2e140 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2e150 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e160 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20       pCur->ix = 
2e170 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2e180 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
2e190 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
2e1a0 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
2e1b0 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
2e1c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   0);.          p
2e1d0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2e1e0 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c   ~BTCF_ValidOvfl
2e1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e200 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2e210 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2e220 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2e230 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2e240 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2e250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e260 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2e270 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
2e280 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
2e290 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e2a0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
2e2b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e2c0 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
2e2d0 20 20 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d         (pIdxKey-
2e2e0 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2e2f0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30  _CORRUPT || c==0
2e300 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  ).         && (p
2e310 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2e320 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
2e330 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64   pCur->pBtree->d
2e340 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
2e350 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2e360 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
2e370 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2e380 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx+1;.        }e
2e390 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20  lse if( c>0 ){. 
2e3a0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2e3b0 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  dx-1;.        }e
2e3c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
2e3d0 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20  ssert( c==0 );. 
2e3e0 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2e3f0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
2e400 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e410 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78          pCur->ix
2e420 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2e430 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 4b         if( pIdxK
2e440 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63  ey->errCode ) rc
2e450 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2e460 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2e470 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2e480 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2e490 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2e4a0 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2e4b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2e4c0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2e4d0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2e4e0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2e4f0 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2e500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2e510 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2e520 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2e530 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2e540 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2e550 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2e560 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2e570 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2e580 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2e590 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67  r->ix<pCur->pPag
2e5a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2e5b0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2e5c0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52  6)idx;.      *pR
2e5d0 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63  es = c;.      rc
2e5e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2e5f0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2e600 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f  finish;.    }.mo
2e610 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a  veto_next_layer:
2e620 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50  .    if( lwr>=pP
2e630 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2e640 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2e650 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2e660 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2e670 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65  fset+8]);.    }e
2e680 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  lse{.      chldP
2e690 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  g = get4byte(fin
2e6a0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72  dCell(pPage, lwr
2e6b0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  ));.    }.    pC
2e6c0 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 6c 77  ur->ix = (u16)lw
2e6d0 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  r;.    rc = move
2e6e0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68  ToChild(pCur, ch
2e6f0 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  ldPg);.    if( r
2e700 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d  c ) break;.  }.m
2e710 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
2e720 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e730 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2e740 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2e750 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2e760 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
2e770 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
2e780 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2e790 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2e7a0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2e7b0 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
2e7c0 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
2e7d0 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
2e7e0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
2e7f0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2e800 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
2e810 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2e820 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
2e830 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
2e840 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
2e850 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
2e860 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
2e870 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
2e880 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2e890 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2e8a0 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
2e8b0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
2e8c0 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
2e8d0 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
2e8e0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
2e8f0 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
2e900 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
2e910 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
2e920 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
2e930 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
2e940 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
2e950 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
2e960 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
2e970 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
2e980 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
2e990 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
2e9a0 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
2e9b0 52 65 74 75 72 6e 20 61 6e 20 65 73 74 69 6d 61  Return an estima
2e9c0 74 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  te for the numbe
2e9d0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
2e9e0 20 74 61 62 6c 65 20 74 68 61 74 20 70 43 75 72   table that pCur
2e9f0 20 69 73 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20   is.** pointing 
2ea00 74 6f 2e 20 20 52 65 74 75 72 6e 20 61 20 6e 65  to.  Return a ne
2ea10 67 61 74 69 76 65 20 6e 75 6d 62 65 72 20 69 66  gative number if
2ea20 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 69 73 20   no estimate is 
2ea30 63 75 72 72 65 6e 74 6c 79 20 0a 2a 2a 20 61 76  currently .** av
2ea40 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 69 36 34 20  ailable..*/.i64 
2ea50 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 77 43  sqlite3BtreeRowC
2ea60 6f 75 6e 74 45 73 74 28 42 74 43 75 72 73 6f 72  ountEst(BtCursor
2ea70 20 2a 70 43 75 72 29 7b 0a 20 20 69 36 34 20 6e   *pCur){.  i64 n
2ea80 3b 0a 20 20 75 38 20 69 3b 0a 0a 20 20 61 73 73  ;.  u8 i;..  ass
2ea90 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2eaa0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2eab0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2eac0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2ead0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2eae0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
2eaf0 43 75 72 72 65 6e 74 6c 79 20 74 68 69 73 20 69  Currently this i
2eb00 6e 74 65 72 66 61 63 65 20 69 73 20 6f 6e 6c 79  nterface is only
2eb10 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 4f   called by the O
2eb20 50 5f 49 66 53 6d 61 6c 6c 65 72 0a 20 20 2a 2a  P_IfSmaller.  **
2eb30 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 69 74 20   opcode, and it 
2eb40 74 68 61 74 20 63 61 73 65 20 74 68 65 20 63 75  that case the cu
2eb50 72 73 6f 72 20 77 69 6c 6c 20 61 6c 77 61 79 73  rsor will always
2eb60 20 62 65 20 76 61 6c 69 64 20 61 6e 64 0a 20 20   be valid and.  
2eb70 2a 2a 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 70  ** will always p
2eb80 6f 69 6e 74 20 74 6f 20 61 20 6c 65 61 66 20 6e  oint to a leaf n
2eb90 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45  ode. */.  if( NE
2eba0 56 45 52 28 70 43 75 72 2d 3e 65 53 74 61 74 65  VER(pCur->eState
2ebb0 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 20  !=CURSOR_VALID) 
2ebc0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69  ) return -1;.  i
2ebd0 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 70  f( NEVER(pCur->p
2ebe0 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 29 20 29  Page->leaf==0) )
2ebf0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 6e   return -1;..  n
2ec00 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   = pCur->pPage->
2ec10 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  nCell;.  for(i=0
2ec20 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b  ; i<pCur->iPage;
2ec30 20 69 2b 2b 29 7b 0a 20 20 20 20 6e 20 2a 3d 20   i++){.    n *= 
2ec40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d  pCur->apPage[i]-
2ec50 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 72 65  >nCell;.  }.  re
2ec60 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
2ec70 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72   Advance the cur
2ec80 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20  sor to the next 
2ec90 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2eca0 61 62 61 73 65 2e 20 0a 2a 2a 20 52 65 74 75 72  abase. .** Retur
2ecb0 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  n value:.**.**  
2ecc0 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20    SQLITE_OK     
2ecd0 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20     success.**   
2ece0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 20   SQLITE_DONE    
2ecf0 20 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65    cursor is alre
2ed00 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ady pointing at 
2ed10 74 68 65 20 6c 61 73 74 20 65 6c 65 6d 65 6e 74  the last element
2ed20 0a 2a 2a 20 20 20 20 6f 74 68 65 72 77 69 73 65  .**    otherwise
2ed30 20 20 20 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e          some kin
2ed40 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72  d of error occur
2ed50 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  red.**.** The ma
2ed60 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69  in entry point i
2ed70 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  s sqlite3BtreeNe
2ed80 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  xt().  That rout
2ed90 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2eda0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2edb0 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2edc0 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74  y incrementing t
2edd0 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2ede0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2edf0 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63 65  * to the next ce
2ee00 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2ee10 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2ee20 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78 74 28  ower) btreeNext(
2ee30 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f 75 74  ) helper.** rout
2ee40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2ee50 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2ee60 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2ee70 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20 6f  different page o
2ee80 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20  r.** to restore 
2ee90 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2eea0 2a 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66  * If bit 0x01 of
2eeb0 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20   the F argument 
2eec0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  in sqlite3BtreeN
2eed0 65 78 74 28 43 2c 46 29 20 69 73 20 31 2c 20 74  ext(C,F) is 1, t
2eee0 68 65 6e 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  hen the.** curso
2eef0 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
2ef00 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2ef10 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  d this routine c
2ef20 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a  ould have been.*
2ef30 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65  * skipped if the
2ef40 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2ef50 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64  een a unique ind
2ef60 65 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d  ex.  The F argum
2ef70 65 6e 74 0a 2a 2a 20 69 73 20 61 20 68 69 6e 74  ent.** is a hint
2ef80 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   to the implemen
2ef90 74 2e 20 20 53 51 4c 69 74 65 20 62 74 72 65 65  t.  SQLite btree
2efa0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2efb0 64 6f 65 73 20 6e 6f 74 20 75 73 65 0a 2a 2a 20  does not use.** 
2efc0 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43  this hint, but C
2efd0 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73  OMDB2 does..*/.s
2efe0 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2eff0 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e  NLINE int btreeN
2f000 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2f010 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
2f020 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
2f030 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2f040 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2f050 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2f060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2f070 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2f080 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2f090 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2f0a0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2f0b0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f0c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2f0d0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2f0e0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2f0f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
2f100 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2f110 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2f120 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2f140 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2f150 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2f160 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2f170 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  te ){.      retu
2f180 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
2f190 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2f1a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a  ur->skipNext ){.
2f1b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2f1c0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2f1d0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2f1e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2f1f0 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20  _SKIPNEXT );.   
2f200 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2f210 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2f220 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2f230 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20  skipNext>0 ){.  
2f240 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2f250 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Next = 0;.      
2f260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f270 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2f280 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2f290 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2f2a0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2f2b0 3e 70 50 61 67 65 3b 0a 20 20 69 64 78 20 3d 20  >pPage;.  idx = 
2f2c0 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a 20 20 69 66  ++pCur->ix;.  if
2f2d0 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  ( !pPage->isInit
2f2e0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6f   ){.    /* The o
2f2f0 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61 79 20 66 6f  nly known way fo
2f300 72 20 74 68 69 73 20 74 6f 20 68 61 70 70 65 6e  r this to happen
2f310 20 69 73 20 66 6f 72 20 74 68 65 72 65 20 74 6f   is for there to
2f320 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 72 65 63   be a.    ** rec
2f330 75 72 73 69 76 65 20 53 51 4c 20 66 75 6e 63 74  ursive SQL funct
2f340 69 6f 6e 20 74 68 61 74 20 64 6f 65 73 20 61 20  ion that does a 
2f350 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
2f360 20 61 73 20 70 61 72 74 20 6f 66 20 61 0a 20 20   as part of a.  
2f370 20 20 2a 2a 20 53 45 4c 45 43 54 20 77 68 69 63    ** SELECT whic
2f380 68 20 64 65 6c 65 74 65 73 20 63 6f 6e 74 65 6e  h deletes conten
2f390 74 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  t out from under
2f3a0 20 61 6e 20 61 63 74 69 76 65 20 63 75 72 73 6f   an active curso
2f3b0 72 0a 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f  r.    ** in a co
2f3c0 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
2f3d0 69 6c 65 20 77 68 65 72 65 20 74 68 65 20 74 61  ile where the ta
2f3e0 62 6c 65 20 62 65 69 6e 67 20 44 45 4c 45 54 45  ble being DELETE
2f3f0 2d 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  -ed from.    ** 
2f400 68 61 73 20 70 61 67 65 73 20 69 6e 20 63 6f 6d  has pages in com
2f410 6d 6f 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  mon with the tab
2f420 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
2f430 2e 20 20 53 65 65 20 54 48 33 0a 20 20 20 20 2a  .  See TH3.    *
2f440 2a 20 6d 6f 64 75 6c 65 20 63 6f 76 31 2f 62 74  * module cov1/bt
2f450 72 65 65 37 38 2e 74 65 73 74 20 74 65 73 74 63  ree78.test testc
2f460 61 73 65 20 32 32 30 20 28 32 30 31 38 2d 30 36  ase 220 (2018-06
2f470 2d 30 38 29 20 66 6f 72 20 61 6e 0a 20 20 20 20  -08) for an.    
2f480 2a 2a 20 65 78 61 6d 70 6c 65 2e 20 2a 2f 0a 20  ** example. */. 
2f490 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f4a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2f4b0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
2f4c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
2f4d0 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20   corrupt, it is 
2f4e0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65  possible for the
2f4f0 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20   value of idx . 
2f500 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69   ** to be invali
2f510 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e  d here. This can
2f520 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61   only occur if a
2f530 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d   second cursor m
2f540 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65  odifies.  ** the
2f550 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72 73   page while curs
2f560 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69  or pCur is holdi
2f570 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  ng a reference t
2f580 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a  o it. Which can.
2f590 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e    ** only happen
2f5a0 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2f5b0 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73   is corrupt in s
2f5c0 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f 20  uch a way as to 
2f5d0 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61  link the.  ** pa
2f5e0 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61  ge into more tha
2f5f0 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72  n one b-tree str
2f600 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73  ucture. */.  tes
2f610 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67 65  tcase( idx>pPage
2f620 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66  ->nCell );..  if
2f630 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( idx>=pPage->nC
2f640 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ell ){.    if( !
2f650 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2f660 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
2f670 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
2f680 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2f690 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2f6a0 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20  set+8]));.      
2f6b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
2f6c0 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rc;.      return
2f6d0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2f6e0 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pCur);.    }.   
2f6f0 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70   do{.      if( p
2f700 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2f710 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2f720 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2f730 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2f740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
2f750 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
2f760 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2f770 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
2f780 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2f790 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
2f7a0 72 2d 3e 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43  r->ix>=pPage->nC
2f7b0 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
2f7c0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2f7d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
2f7e0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2f7f0 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ur, 0);.    }els
2f800 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
2f810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2f820 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2f830 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
2f840 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2f860 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2f870 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
2f880 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2f890 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2f8a0 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  Cur, int flags){
2f8b0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2f8c0 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  e;.  UNUSED_PARA
2f8d0 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20  METER( flags ); 
2f8e0 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44   /* Used in COMD
2f8f0 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76  B2 but not nativ
2f900 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73  e SQLite */.  as
2f910 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2f920 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2f930 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
2f940 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31  s==0 || flags==1
2f950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2f960 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2f970 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2f980 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2f990 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2f9a0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2f9b0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2f9c0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2f9d0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2f9e0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2f9f0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2fa00 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
2fa10 78 74 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67  xt(pCur);.  pPag
2fa20 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2fa30 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
2fa40 69 78 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  ix)>=pPage->nCel
2fa50 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69  l ){.    pCur->i
2fa60 78 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  x--;.    return 
2fa70 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29 3b  btreeNext(pCur);
2fa80 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2fa90 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
2faa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2fab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2fac0 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2fad0 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
2fae0 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
2faf0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
2fb00 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
2fb10 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
2fb20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74  database..** Ret
2fb30 75 72 6e 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a  urn values:.**.*
2fb40 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  *     SQLITE_OK 
2fb50 20 20 20 20 73 75 63 63 65 73 73 0a 2a 2a 20 20      success.**  
2fb60 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20     SQLITE_DONE  
2fb70 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
2fb80 6c 72 65 61 64 79 20 6f 6e 20 74 68 65 20 66 69  lready on the fi
2fb90 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  rst element of t
2fba0 68 65 20 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20  he table.**     
2fbb0 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 73 6f  otherwise     so
2fbc0 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  me kind of error
2fbd0 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20   occurred.**.** 
2fbe0 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2fbf0 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2fc00 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20  treePrevious(). 
2fc10 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2fc20 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2fc30 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2fc40 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72  e of merely decr
2fc50 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2fc60 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2fc70 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2fc80 68 65 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c  he previous cell
2fc90 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
2fca0 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77  page.  The (slow
2fcb0 65 72 29 20 62 74 72 65 65 50 72 65 76 69 6f 75  er) btreePreviou
2fcc0 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f  s().** helper ro
2fcd0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2fce0 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2fcf0 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2fd00 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2fd10 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72  .** or to restor
2fd20 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2fd30 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30 31 20  .** If bit 0x01 
2fd40 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d 65 6e  of the F argumen
2fd50 74 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  t to sqlite3Btre
2fd60 65 50 72 65 76 69 6f 75 73 28 43 2c 46 29 20 69  ePrevious(C,F) i
2fd70 73 20 31 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  s 1, then.** the
2fd80 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f   cursor correspo
2fd90 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
2fda0 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75  dex and this rou
2fdb0 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
2fdc0 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20  been.** skipped 
2fdd0 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78  if the SQL index
2fde0 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71   had been a uniq
2fdf0 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46  ue index.  The F
2fe00 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a   argument is a.*
2fe10 2a 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  * hint to the im
2fe20 70 6c 65 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61  plement.  The na
2fe30 74 69 76 65 20 53 51 4c 69 74 65 20 62 74 72 65  tive SQLite btre
2fe40 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2fe50 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65   does not.** use
2fe60 20 74 68 69 73 20 68 69 6e 74 2c 20 62 75 74 20   this hint, but 
2fe70 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a  COMDB2 does..*/.
2fe80 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
2fe90 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
2fea0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
2feb0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
2fec0 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
2fed0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2fee0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2fef0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2ff00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2ff10 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2ff20 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2ff30 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2ff40 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2ff50 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
2ff60 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2ff70 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2ff80 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
2ff90 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2ffa0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
2ffb0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2ffc0 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2ffd0 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2ffe0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2fff0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
30000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30010 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30020 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
30030 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
30040 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
30050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30060 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  DONE;.    }.    
30070 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
30080 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
30090 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
300a0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
300b0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
300c0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
300d0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
300e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
300f0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
30100 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
30110 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
30120 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
30130 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
30140 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
30150 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
30160 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
30170 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
30180 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
30190 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
301a0 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21  sInit );.  if( !
301b0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
301c0 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75     int idx = pCu
301d0 72 2d 3e 69 78 3b 0a 20 20 20 20 72 63 20 3d 20  r->ix;.    rc = 
301e0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
301f0 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  , get4byte(findC
30200 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29  ell(pPage, idx))
30210 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
30220 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72  return rc;.    r
30230 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
30240 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
30250 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
30260 43 75 72 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20  Cur->ix==0 ){.  
30270 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
30280 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
30290 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
302a0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
302b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
302c0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
302d0 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
302e0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
302f0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
30300 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
30310 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
30320 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
30330 61 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69  ags & (BTCF_Vali
30340 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20  dOvfl))==0 );.. 
30350 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20     pCur->ix--;. 
30360 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
30370 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  >pPage;.    if( 
30380 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
30390 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
303a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
303b0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
303c0 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  (pCur, 0);.    }
303d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
303e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
303f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
30400 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
30410 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74  BtreePrevious(Bt
30420 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
30430 74 20 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65  t flags){.  asse
30440 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
30450 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
30460 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
30470 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29  =0 || flags==1 )
30480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
30490 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
304a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
304b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
304c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
304d0 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20  R( flags );  /* 
304e0 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62  Used in COMDB2 b
304f0 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51  ut not native SQ
30500 4c 69 74 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  Lite */.  pCur->
30510 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
30520 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
30530 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
30540 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
30550 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
30560 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
30570 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
30580 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69  ID.   || pCur->i
30590 78 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  x==0.   || pCur-
305a0 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a  >pPage->leaf==0.
305b0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
305c0 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  btreePrevious(pC
305d0 75 72 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ur);.  }.  pCur-
305e0 3e 69 78 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20  >ix--;.  return 
305f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
30600 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
30610 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
30620 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
30630 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
30640 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
30650 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
30660 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
30670 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
30680 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
30690 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
306a0 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
306b0 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
306c0 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
306d0 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
306e0 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
306f0 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
30700 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
30710 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
30720 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
30730 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
30740 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
30750 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
30760 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
30770 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
30780 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
30790 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 69  rror.  *ppPage i
307a0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e  s set to NULL in
307b0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e   the event of an
307c0 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66   error..**.** If
307d0 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
307e0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
307f0 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72 74  , then an effort
30800 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
30810 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
30820 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
30830 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
30840 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
30850 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
30860 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
30870 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
30880 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
30890 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
308a0 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
308b0 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
308c0 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
308d0 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
308e0 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65 74  he eMode paramet
308f0 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58  er is BTALLOC_EX
30900 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61 72  ACT and the near
30910 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a 2a  by page exists.*
30920 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68  * anywhere on th
30930 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65  e free-list, the
30940 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65  n it is guarante
30950 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ed to be returne
30960 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20  d.  If.** eMode 
30970 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68  is BTALLOC_LT th
30980 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74 75  en the page retu
30990 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65 73  rned will be les
309a0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
309b0 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66 20  ** to nearby if 
309c0 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65 78  any such page ex
309d0 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65 20  ists.  If eMode 
309e0 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74  is BTALLOC_ANY t
309f0 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72 65  hen there.** are
30a00 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e 73   no restrictions
30a10 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20 69   on which page i
30a20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
30a30 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
30a40 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
30a50 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
30a60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
30a70 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
30a80 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 2f  **ppPage,      /
30a90 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72 20  * Store pointer 
30aa0 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  to the allocated
30ab0 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20   page here */.  
30ac0 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20  Pgno *pPgno,    
30ad0 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
30ae0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
30af0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  here */.  Pgno n
30b00 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20 20  earby,          
30b10 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61   /* Search for a
30b20 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73 20   page near this 
30b30 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64  one */.  u8 eMod
30b40 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
30b50 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  /* BTALLOC_EXACT
30b60 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72  , BTALLOC_LT, or
30b70 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a   BTALLOC_ANY */.
30b80 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
30b90 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  age1;.  int rc;.
30ba0 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20    u32 n;     /* 
30bb0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
30bc0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
30bd0 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20  */.  u32 k;     
30be0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
30bf0 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  ves on the trunk
30c00 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
30c10 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
30c20 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d  Trunk = 0;.  Mem
30c30 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b  Page *pPrevTrunk
30c40 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50   = 0;.  Pgno mxP
30c50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61  age;     /* Tota
30c60 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  l size of the da
30c70 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
30c80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30c90 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
30ca0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
30cb0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41  sert( eMode==BTA
30cc0 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61  LLOC_ANY || (nea
30cd0 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d  rby>0 && IfNotOm
30ce0 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56 61  itAV(pBt->autoVa
30cf0 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61 67  cuum)) );.  pPag
30d00 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
30d10 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74 72  ;.  mxPage = btr
30d20 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
30d30 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ;.  /* EVIDENCE-
30d40 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36 33  OF: R-05119-0263
30d50 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  7 The 4-byte big
30d60 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
30d70 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20 2a  at offset 36.  *
30d80 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73 20  * stores stores 
30d90 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
30da0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
30db0 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20   freelist. */.  
30dc0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
30dd0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
30de0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
30df0 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20 69  =mxPage-1 );.  i
30e00 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a  f( n>=mxPage ){.
30e10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30e20 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
30e30 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b    }.  if( n>0 ){
30e40 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
30e50 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  e pages on the f
30e60 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20  reelist.  Reuse 
30e70 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67  one of those pag
30e80 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  es. */.    Pgno 
30e90 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73  iTrunk;.    u8 s
30ea0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f  earchList = 0; /
30eb0 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  * If the free-li
30ec0 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72 63  st must be searc
30ed0 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27  hed for 'nearby'
30ee0 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65 61   */.    u32 nSea
30ef0 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f  rch = 0;   /* Co
30f00 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
30f10 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74 65  r of search atte
30f20 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20  mpts */.    .   
30f30 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54   /* If eMode==BT
30f40 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
30f50 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 70  a query of the p
30f60 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a  ointer-map.    *
30f70 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68 65  * shows that the
30f80 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69   page 'nearby' i
30f90 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74  s somewhere on t
30fa0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
30fb0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e  en.    ** the en
30fc0 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  tire-list will b
30fd0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74  e searched for t
30fe0 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  hat page..    */
30ff0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31000 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31010 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
31020 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a  TALLOC_EXACT ){.
31030 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
31040 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
31050 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
31060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
31070 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
31080 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
31090 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20  utoVacuum );.   
310a0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
310b0 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
310c0 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
310d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
310e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
310f0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
31100 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
31110 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
31120 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ist = 1;.       
31130 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
31140 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d  else if( eMode==
31150 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20  BTALLOC_LE ){.  
31160 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
31170 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
31180 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
31190 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  nt the free-list
311a0 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74   count by 1. Set
311b0 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69   iTrunk to the i
311c0 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20  ndex of the.    
311d0 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69  ** first free-li
311e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69  st trunk page. i
311f0 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69  PrevTrunk is ini
31200 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f  tially 1..    */
31210 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31220 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
31230 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
31240 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
31250 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79  n rc;.    put4by
31260 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
31270 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20  a[36], n-1);..  
31280 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69    /* The code wi
31290 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69  thin this loop i
312a0 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20  s run only once 
312b0 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69  if the 'searchLi
312c0 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20  st' variable.   
312d0 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e   ** is not true.
312e0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72   Otherwise, it r
312f0 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
31300 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20  h trunk-page on 
31310 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d  the.    ** free-
31320 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70  list until the p
31330 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
31340 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
31350 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20  BTALLOC_EXACT). 
31360 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61     ** or until a
31370 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e 20   page less than 
31380 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61  'nearby' is loca
31390 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c  ted (eMode==BTAL
313a0 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20  LOC_LT).    */. 
313b0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
313c0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
313d0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
313e0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
313f0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
31400 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35 33  F: R-01506-11053
31410 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65 67   The first integ
31420 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
31430 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
31440 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70 61      ** is the pa
31450 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
31460 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20 74   next freelist t
31470 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
31480 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20 20   list or.       
31490 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69 73   ** zero if this
314a0 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72 65   is the last fre
314b0 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
314c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
314d0 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
314e0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
314f0 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
31500 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45  se{.        /* E
31510 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
31520 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34 2d  841-13798 The 4-
31530 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
31540 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
31550 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  t 32.        ** 
31560 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65 20  stores the page 
31570 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
31580 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
31590 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72  freelist, or zer
315a0 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  o if.        ** 
315b0 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
315c0 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20  empty. */.      
315d0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
315e0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
315f0 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
31600 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
31610 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20   iTrunk==mxPage 
31620 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 72  );.      if( iTr
31630 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53  unk>mxPage || nS
31640 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20  earch++ > n ){. 
31650 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31660 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
31670 70 50 72 65 76 54 72 75 6e 6b 20 3f 20 70 50 72  pPrevTrunk ? pPr
31680 65 76 54 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20  evTrunk->pgno : 
31690 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1);.      }else{
316a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
316b0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
316c0 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
316d0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
316e0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
316f0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
31700 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
31710 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
31720 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20  _page;.      }. 
31730 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
31740 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk!=0 );.      
31750 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e  assert( pTrunk->
31760 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20  aData!=0 );.    
31770 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
31780 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20  : R-13523-04394 
31790 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67  The second integ
317a0 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74  er on a freelist
317b0 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20   trunk page.    
317c0 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62    ** is the numb
317d0 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20  er of leaf page 
317e0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c  pointers to foll
317f0 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d  ow. */.      k =
31800 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
31810 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
31820 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
31830 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
31840 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
31850 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
31860 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
31870 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
31880 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
31890 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
318a0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
318b0 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
318c0 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
318d0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
318e0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
318f0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
31900 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
31910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31920 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
31930 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
31940 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
31950 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
31960 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
31970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31980 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
31990 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
319a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
319b0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
319c0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
319d0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
319e0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
319f0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
31a00 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
31a10 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
31a20 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
31a30 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
31a40 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
31a50 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
31a60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
31a70 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
31a80 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
31a90 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
31aa0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
31ab0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
31ac0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
31ad0 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
31ae0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31af0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
31b00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31b10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
31b20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
31b30 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
31b40 20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62         && (nearb
31b50 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54  y==iTrunk || (iT
31b60 72 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65  runk<nearby && e
31b70 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45  Mode==BTALLOC_LE
31b80 29 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  )) .      ){.   
31b90 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74       /* The list
31ba0 20 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68   is being search
31bb0 65 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e  ed and this trun
31bc0 6b 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  k page is the pa
31bd0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  ge.        ** to
31be0 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72   allocate, regar
31bf0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
31c00 20 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a   it has leaves..
31c10 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
31c20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75     *pPgno = iTru
31c30 6e 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50  nk;.        *ppP
31c40 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  age = pTrunk;.  
31c50 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
31c60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
31c70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31c80 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
31c90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
31ca0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
31cb0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31cc0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31cd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
31ce0 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   k==0 ){.       
31cf0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
31d00 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
31d10 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31    memcpy(&pPage1
31d20 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54  ->aData[32], &pT
31d30 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31d40 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  4);.          }e
31d50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
31d60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
31d70 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
31d80 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
31d90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
31da0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
31db0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
31dc0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
31dd0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  age;.           
31de0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
31df0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
31e00 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
31e10 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
31e20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
31e30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
31e40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31e50 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
31e60 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
31e70 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
31e80 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
31e90 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
31ea0 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
31eb0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
31ec0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
31ed0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
31ee0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
31ef0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
31f00 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
31f10 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
31f20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
31f30 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
31f40 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
31f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
31f60 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
31f70 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
31f80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
31f90 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e  RRUPT_PGNO(iTrun
31fa0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
31fb0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31fc0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
31fd0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65    }.          te
31fe0 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e  stcase( iNewTrun
31ff0 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
32000 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
32010 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
32020 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
32030 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
32040 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
32050 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32060 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32070 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32080 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32090 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
320a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
320b0 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
320c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
320d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
320e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
320f0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
32100 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
32110 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32120 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32140 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
32150 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
32160 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
32170 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
32180 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
32190 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
321a0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
321b0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
321c0 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
321d0 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
321e0 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
321f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32200 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
32210 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
32220 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
32230 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
32240 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32250 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
32260 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
32270 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
32280 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
32290 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
322a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
322b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
322c0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
322d0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
322e0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
322f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
32300 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32310 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32320 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
32330 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
32340 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
32350 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
32360 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
32370 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
32380 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
32390 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
323a0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
323b0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
323c0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
323d0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
323e0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
323f0 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
32400 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
32410 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
32420 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
32430 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
32440 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
32450 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
32460 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
32470 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
32480 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62         if( nearb
32490 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
324a0 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20   u32 i;.        
324b0 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
324c0 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f           if( eMo
324d0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
324e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
324f0 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=0; i<k; i++)
32500 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
32510 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
32520 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b  (&aData[8+i*4]);
32530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
32540 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79  f( iPage<=nearby
32550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32560 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
32570 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32580 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
32590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
325a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
325b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
325c0 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20     int dist;.   
325d0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
325e0 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28  sqlite3AbsInt32(
325f0 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
32600 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  8]) - nearby);. 
32610 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
32620 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =1; i<k; i++){. 
32630 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
32640 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73   d2 = sqlite3Abs
32650 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
32660 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
32670 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20  nearby);.       
32680 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69         if( d2<di
32690 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  st ){.          
326a0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
326b0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i;.             
326c0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
326d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
326e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
326f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32710 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
32720 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
32730 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
32740 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
32750 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
32760 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
32770 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
32780 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50     if( iPage>mxP
32790 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
327a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
327b0 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b  RUPT_PGNO(iTrunk
327c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
327d0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
327e0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
327f0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32800 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
32810 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
32820 65 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20  earchList .     
32830 20 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e      || (iPage==n
32840 65 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c  earby || (iPage<
32850 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
32860 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
32870 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
32880 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e      int noConten
32890 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  t;.          *pP
328a0 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
328b0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
328c0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
328d0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
328e0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
328f0 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
32900 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
32910 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
32920 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
32930 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
32940 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
32950 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32960 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32970 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
32980 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
32990 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
329a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
329b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
329c0 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
329d0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
329e0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
329f0 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
32a00 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
32a10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
32a20 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
32a30 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
32a40 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
32a50 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
32a60 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20  t(pBt, *pPgno)? 
32a70 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
32a80 45 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  ENT : 0;.       
32a90 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
32aa0 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
32ab0 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
32ac0 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  noContent);.    
32ad0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32ae0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32af0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32b00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
32b10 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
32b20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
32b30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32b40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32b50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
32b60 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
32b70 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
32b80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
32b90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32ba0 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
32bb0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
32bc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
32bd0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
32be0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
32bf0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
32c00 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
32c10 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
32c20 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
32c30 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
32c40 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61  e freelist, so a
32c50 70 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65  ppend a new page
32c60 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
32c70 61 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20  atabase image.. 
32c80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72     **.    ** Nor
32c90 6d 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73  mally, new pages
32ca0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
32cb0 69 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20  is block can be 
32cc0 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
32cd0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20  he.    ** pager 
32ce0 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27  layer with the '
32cf0 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67  no-content' flag
32d00 20 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65   set. This preve
32d10 6e 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20  nts the pager.  
32d20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67    ** from trying
32d30 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67   to read the pag
32d40 65 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  es content from 
32d50 64 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  disk. However, i
32d60 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  f the.    ** cur
32d70 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
32d80 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
32d90 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63   one or more inc
32da0 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a  remental-vacuum.
32db0 20 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68      ** steps, th
32dc0 65 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61  en the page we a
32dd0 72 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f  re about to allo
32de0 63 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cate may contain
32df0 20 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20   content.    ** 
32e00 74 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64  that is required
32e10 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
32e20 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20   a rollback. In 
32e30 74 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20  this case, do.  
32e40 20 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65    ** not set the
32e50 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67   no-content flag
32e60 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68  . This causes th
32e70 65 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20  e pager to load 
32e80 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  and journal.    
32e90 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ** the current p
32ea0 61 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f  age content befo
32eb0 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69  re overwriting i
32ec0 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
32ed0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
32ee0 61 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63  ager will not ac
32ef0 74 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74  tually attempt t
32f00 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61  o load or journa
32f10 6c 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e  l .    ** conten
32f20 74 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74  t for any page t
32f30 68 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  hat really does 
32f40 6c 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  lie past the end
32f50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
32f60 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20  .    ** file on 
32f70 64 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66  disk. So the eff
32f80 65 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e  ects of disablin
32f90 67 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74  g the no-content
32fa0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
32fb0 20 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f    ** here are co
32fc0 6e 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20  nfined to those 
32fd0 70 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62  pages that lie b
32fe0 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f  etween the end o
32ff0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  f the.    ** dat
33000 61 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20  abase image and 
33010 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64  the end of the d
33020 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
33030 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f    */.    int bNo
33040 43 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66  Content = (0==If
33050 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
33060 44 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41  DoTruncate))? PA
33070 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
33080 54 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73  T:0;..    rc = s
33090 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
330a0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
330b0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
330c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
330d0 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
330e0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  ;.    if( pBt->n
330f0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
33100 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70  TE_PAGE(pBt) ) p
33110 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69  Bt->nPage++;..#i
33120 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33130 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
33140 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
33150 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
33160 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
33170 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  nPage) ){.      
33180 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66  /* If *pPgno ref
33190 65 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72  ers to a pointer
331a0 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63  -map page, alloc
331b0 61 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65  ate two new page
331c0 73 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68  s.      ** at th
331d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
331e0 65 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65  e instead of one
331f0 2e 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f  . The first allo
33200 63 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20  cated page.     
33210 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65   ** becomes a ne
33220 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  w pointer-map pa
33230 67 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  ge, the second i
33240 73 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61  s used by the ca
33250 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ller..      */. 
33260 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50       MemPage *pP
33270 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41  g = 0;.      TRA
33280 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
33290 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
332a0 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20  le (pointer-map 
332b0 70 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e  page)\n", pBt->n
332c0 50 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73  Page));.      as
332d0 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65  sert( pBt->nPage
332e0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
332f0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
33300 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
33310 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70  nusedPage(pBt, p
33320 42 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c  Bt->nPage, &pPg,
33330 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20   bNoContent);.  
33340 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
33350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
33360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
33370 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62  erWrite(pPg->pDb
33380 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
33390 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b  eleasePage(pPg);
333a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
333b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
333c0 63 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  c;.      pBt->nP
333d0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  age++;.      if(
333e0 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e   pBt->nPage==PEN
333f0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
33400 42 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67  Bt) ){ pBt->nPag
33410 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e  e++; }.    }.#en
33420 64 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65  dif.    put4byte
33430 28 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e  (28 + (u8*)pBt->
33440 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70  pPage1->aData, p
33450 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
33460 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50  *pPgno = pBt->nP
33470 61 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  age;..    assert
33480 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
33490 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
334a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   );.    rc = btr
334b0 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
334c0 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50  pBt, *pPgno, ppP
334d0 61 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  age, bNoContent)
334e0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
334f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
33500 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33510 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
33520 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
33530 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33540 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
33550 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
33560 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
33570 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
33580 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
33590 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
335a0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
335b0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
335c0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
335d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
335e0 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
335f0 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
33600 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
33610 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
33620 72 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28  runk);.  assert(
33630 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
33640 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
33650 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
33660 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d  age)->pDbPage)<=
33670 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  1 );.  assert( r
33680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
33690 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
336a0 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
336b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
336c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
336d0 73 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20  sed to add page 
336e0 69 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  iPage to the dat
336f0 61 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d  abase file free-
33700 6c 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20  list. .** It is 
33710 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
33720 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
33730 65 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74  eady a part of t
33740 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
33750 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61  .** The value pa
33760 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
33770 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
33780 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
33790 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20  optional..** If 
337a0 74 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65  the caller happe
337b0 6e 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69  ns to have a poi
337c0 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
337d0 61 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  age object .** c
337e0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
337f0 70 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79  page iPage handy
33800 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74  , it may pass it
33810 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76   as the second v
33820 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  alue. .** Otherw
33830 69 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73  ise, it may pass
33840 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
33850 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d  a pointer to a M
33860 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73  emPage object is
33870 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
33880 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
33890 2a 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  ** its reference
338a0 20 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c   count is not al
338b0 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75  tered by this fu
338c0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
338d0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28  c int freePage2(
338e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d  BtShared *pBt, M
338f0 65 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65  emPage *pMemPage
33900 2c 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20  , Pgno iPage){. 
33910 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
33920 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
33930 20 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73       /* Free-lis
33940 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  t trunk page */.
33950 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20    Pgno iTrunk = 
33960 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
33970 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
33980 6d 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73  mber of free-lis
33990 74 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20  t trunk page */ 
339a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
339b0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
339c0 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
339d0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
339e0 65 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  e 1 */.  MemPage
339f0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
33a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33a10 50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64  Page being freed
33a20 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a  . May be NULL. *
33a30 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
33a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
33a60 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
33a70 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
33a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a90 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
33aa0 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72  r of pages on fr
33ab0 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
33ac0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
33ad0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
33ae0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
33af0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
33b00 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73  iPage>1 );.  ass
33b10 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c  ert( !pMemPage |
33b20 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f  | pMemPage->pgno
33b30 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66  ==iPage );..  if
33b40 28 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75  ( iPage<2 ) retu
33b50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
33b60 54 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d  T_BKPT;.  if( pM
33b70 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
33b80 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
33b90 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
33ba0 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
33bb0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
33bc0 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
33bd0 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
33be0 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
33bf0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
33c00 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
33c10 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
33c20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33c30 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
33c40 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
33c50 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
33c60 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
33c70 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
33c80 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
33c90 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
33ca0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
33cb0 65 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74  e+1);..  if( pBt
33cc0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
33cd0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
33ce0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
33cf0 73 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70  secure_delete op
33d00 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
33d10 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77   then.    ** alw
33d20 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72  ays fully overwr
33d30 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f  ite deleted info
33d40 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72  rmation with zer
33d50 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  os..    */.    i
33d60 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28  f( (!pPage && ((
33d70 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
33d80 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
33d90 50 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a  Page, 0))!=0) ).
33da0 20 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20       ||         
33db0 20 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65     ((rc = sqlite
33dc0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
33dd0 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29  e->pDbPage))!=0)
33de0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
33df0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
33e00 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
33e10 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
33e20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  0, pPage->pBt->p
33e30 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  ageSize);.  }.. 
33e40 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
33e50 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
33e60 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
33e70 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
33e80 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
33e90 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
33ea0 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
33eb0 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
33ec0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
33ed0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
33ee0 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f  , iPage, PTRMAP_
33ef0 46 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63  FREEPAGE, 0, &rc
33f00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33f10 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
33f20 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
33f30 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
33f40 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
33f50 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
33f60 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
33f70 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
33f80 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
33f90 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
33fa0 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
33fb0 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
33fc0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
33fd0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
33fe0 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
33ff0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
34000 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
34010 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
34020 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
34030 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
34040 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
34050 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
34060 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
34070 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
34080 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
34090 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
340a0 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
340b0 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
340c0 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
340d0 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
340e0 7b 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b  {.    u32 nLeaf;
340f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34100 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
34110 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
34120 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
34130 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
34140 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
34150 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
34160 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
34170 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
34180 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
34190 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
341a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
341b0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
341c0 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20     }..    nLeaf 
341d0 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
341e0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
341f0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
34200 75 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b  usableSize>32 );
34210 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e  .    if( nLeaf >
34220 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c   (u32)pBt->usabl
34230 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20  eSize/4 - 2 ){. 
34240 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34250 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
34260 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
34270 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
34280 20 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75    if( nLeaf < (u
34290 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
342a0 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20  ze/4 - 8 ){.    
342b0 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73    /* In this cas
342c0 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20  e there is room 
342d0 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  on the trunk pag
342e0 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  e to insert the 
342f0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
34300 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e  ing freed as a n
34310 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a  ew leaf..      *
34320 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20  *.      ** Note 
34330 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70  that the trunk p
34340 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c  age is not reall
34350 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20  y full until it 
34360 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a  contains.      *
34370 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
34380 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20   2 entries, not 
34390 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
343a0 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68   entries as we h
343b0 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64  ave.      ** cod
343c0 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20  ed.  But due to 
343d0 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69  a coding error i
343e0 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  n versions of SQ
343f0 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20  Lite prior to.  
34400 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61      ** 3.6.0, da
34410 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65  tabases with fre
34420 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
34430 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74  s holding more t
34440 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  han.      ** usa
34450 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
34460 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65  tries will be re
34470 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70  ported as corrup
34480 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20  t.  In order.   
34490 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69     ** to maintai
344a0 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  n backwards comp
344b0 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f  atibility with o
344c0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
344d0 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
344e0 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  * we will contin
344f0 75 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  ue to restrict t
34500 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
34510 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
34520 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
34530 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
34540 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
34550 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
34560 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
34570 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
34580 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
34590 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
345a0 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
345b0 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
345c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
345d0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
345e0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
345f0 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
34600 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
34610 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
34620 31 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65  19920-11576 Howe
34630 76 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69  ver, newer versi
34640 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74  ons of SQLite st
34650 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f  ill.      ** avo
34660 69 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73  id using the las
34670 74 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e  t six entries in
34680 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72   the freelist tr
34690 75 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69  unk page array i
346a0 6e 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72  n.      ** order
346b0 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66   that database f
346c0 69 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20  iles created by 
346d0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
346e0 66 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a  f SQLite can be.
346f0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79        ** read by
34700 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
34710 6f 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20  of SQLite..     
34720 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
34730 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34740 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
34750 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
34760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
34770 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
34780 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
34790 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20  , nLeaf+1);.    
347a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
347b0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c  runk->aData[8+nL
347c0 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a  eaf*4], iPage);.
347d0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
347e0 65 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  e && (pBt->btsFl
347f0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
34800 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20  _DELETE)==0 ){. 
34810 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
34820 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
34830 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
34840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34850 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
34860 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
34870 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
34880 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
34890 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
348a0 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
348b0 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
348c0 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
348d0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
348e0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
348f0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
34900 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
34910 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
34920 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
34930 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
34940 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
34950 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
34960 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
34970 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
34980 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
34990 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
349a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
349b0 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
349c0 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
349d0 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
349e0 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
349f0 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
34a00 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
34a10 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
34a20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
34a30 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
34a40 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
34a50 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
34a60 20 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26   if( pPage==0 &&
34a70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
34a80 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
34a90 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
34aa0 65 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f  e, 0)) ){.    go
34ab0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34ac0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
34ad0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34ae0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
34af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
34b00 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  OK ){.    goto f
34b10 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  reepage_out;.  }
34b20 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67  .  put4byte(pPag
34b30 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b  e->aData, iTrunk
34b40 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
34b50 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
34b60 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  0);.  put4byte(&
34b70 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
34b80 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41  ], iPage);.  TRA
34b90 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20  CE(("FREE-PAGE: 
34ba0 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67  %d new trunk pag
34bb0 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e  e replacing %d\n
34bc0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
34bd0 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70  iTrunk));..freep
34be0 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
34bf0 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
34c00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
34c10 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65   }.  releasePage
34c20 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61  (pPage);.  relea
34c30 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
34c40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73    return rc;.}.s
34c50 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
34c60 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
34c70 67 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  ge, int *pRC){. 
34c80 20 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c   if( (*pRC)==SQL
34c90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
34ca0 52 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70  RC = freePage2(p
34cb0 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65  Page->pBt, pPage
34cc0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
34cd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
34ce0 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
34cf0 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
34d00 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
34d10 65 6c 6c 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 73  ell.  Store.** s
34d20 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ize information 
34d30 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 69  about the cell i
34d40 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74  n pInfo..*/.stat
34d50 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c  ic int clearCell
34d60 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
34d70 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
34d80 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
34d90 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20  ntains the Cell 
34da0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
34db0 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a  ar *pCell,    /*
34dc0 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
34dd0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c  he Cell */.  Cel
34de0 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
34df0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e        /* Size in
34e00 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
34e10 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20  the cell */.){. 
34e20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
34e30 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
34e40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
34e50 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
34e60 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
34e70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
34e80 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
34e90 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
34ea0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
34eb0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
34ec0 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , pInfo);.  if( 
34ed0 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70  pInfo->nLocal==p
34ee0 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29  Info->nPayload )
34ef0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
34f00 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
34f10 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
34f20 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
34f30 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
34f40 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
34f50 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e  pCell + pInfo->n
34f60 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 2d 3e 61  Size == pPage->a
34f70 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 74 65 73  DataEnd );.  tes
34f80 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b 20 28  tcase( pCell + (
34f90 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 2d 31 29 20  pInfo->nSize-1) 
34fa0 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  == pPage->aDataE
34fb0 6e 64 20 29 3b 0a 20 20 69 66 28 20 70 43 65 6c  nd );.  if( pCel
34fc0 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  l + pInfo->nSize
34fd0 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45   > pPage->aDataE
34fe0 6e 64 20 29 7b 0a 20 20 20 20 2f 2a 20 43 65 6c  nd ){.    /* Cel
34ff0 6c 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65  l extends past e
35000 6e 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20  nd of page */.  
35010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35020 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
35030 67 65 29 3b 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  ge);.  }.  ovflP
35040 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
35050 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53  Cell + pInfo->nS
35060 69 7a 65 20 2d 20 34 29 3b 0a 20 20 70 42 74 20  ize - 4);.  pBt 
35070 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
35080 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
35090 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
350a0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
350b0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
350c0 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
350d0 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
350e0 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  - pInfo->nLocal 
350f0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
35100 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
35110 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66  ;.  assert( nOvf
35120 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52  l>0 || .    (COR
35130 52 55 50 54 5f 44 42 20 26 26 20 28 70 49 6e 66  RUPT_DB && (pInf
35140 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20 6f 76  o->nPayload + ov
35150 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76 66 6c  flPageSize)<ovfl
35160 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b 0a 20  PageSize).  );. 
35170 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
35180 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
35190 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
351a0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
351b0 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
351c0 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 62 74  2 || ovflPgno>bt
351d0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
351e0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
351f0 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
35200 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
35210 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
35220 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
35230 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
35240 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
35250 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
35260 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
35270 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
35280 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
35290 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
352a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
352b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
352c0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
352d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
352e0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
352f0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
35300 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
35310 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
35320 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
35330 20 20 20 20 69 66 28 20 28 20 70 4f 76 66 6c 20      if( ( pOvfl 
35340 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62 74 72  || ((pOvfl = btr
35350 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
35360 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d 30 29  , ovflPgno))!=0)
35370 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74   ).     && sqlit
35380 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
35390 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  unt(pOvfl->pDbPa
353a0 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a 20 20  ge)!=1.    ){.  
353b0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
353c0 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20 63 75  no reason any cu
353d0 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61 76 65  rsor should have
353e0 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
353f0 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20 20 20  reference .     
35400 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c   ** to an overfl
35410 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ow page belongin
35420 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68 61 74  g to a cell that
35430 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65 74 65   is being delete
35440 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20  d/updated..     
35450 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72 65 20   ** So if there 
35460 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68 61 6e  exists more than
35470 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 74   one reference t
35480 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 65  o this page, the
35490 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a 20 6d  n it .      ** m
354a0 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62  ust not really b
354b0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
354c0 67 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ge and the datab
354d0 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
354e0 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a 20 49  upt. .      ** I
354f0 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74 6f 20  t is helpful to 
35500 64 65 74 65 63 74 20 74 68 69 73 20 62 65 66 6f  detect this befo
35510 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65 65 50  re calling freeP
35520 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20 20 20  age2(), as .    
35530 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32 28 29    ** freePage2()
35540 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20 70 61   may zero the pa
35550 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66 20 73  ge contents if s
35560 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64  ecure-delete mod
35570 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 65 6e  e is.      ** en
35580 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73 20 27  abled. If this '
35590 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65 20 68  overflow' page h
355a0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 70  appens to be a p
355b0 61 67 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  age that the.   
355c0 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69 73 20     ** caller is 
355d0 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
355e0 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20 73 6f  h or using in so
355f0 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20 74 68  me other way, th
35600 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61 6e 20  is.      ** can 
35610 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63 2e 0a  be problematic..
35620 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
35630 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
35640 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c  PT_BKPT;.    }el
35650 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66  se{.      rc = f
35660 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
35670 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
35680 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
35690 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
356a0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
356b0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
356c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
356d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
356e0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
356f0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
35700 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
35710 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
35720 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
35730 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
35740 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
35750 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
35760 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
35770 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
35780 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
35790 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
357a0 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
357b0 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
357c0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
357d0 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
357e0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
357f0 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
35800 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
35810 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
35820 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
35830 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
35840 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
35850 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
35860 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
35870 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
35880 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
35890 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
358a0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
358b0 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
358c0 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
358d0 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
358e0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
358f0 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
35900 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
35910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
35920 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
35930 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
35940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
35950 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
35960 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
35970 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35980 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
35990 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
359a0 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
359b0 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65 65 50  /.  const BtreeP
359c0 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20 20 20  ayload *pX,     
359d0 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20 77 69     /* Payload wi
359e0 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73  th which to cons
359f0 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c 20 2a  truct the cell *
35a00 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20  /.  int *pnSize 
35a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c     /* Write cell
35a30 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b   size here */.){
35a40 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b  .  int nPayload;
35a50 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72  .  const u8 *pSr
35a60 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e  c;.  int nSrc, n
35a70 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20 69 6e 74 20  , rc, mn;.  int 
35a80 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
35a90 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
35aa0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
35ab0 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
35ac0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
35ad0 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
35ae0 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67   *pBt;.  Pgno pg
35af0 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6e 48  noOvfl;.  int nH
35b00 65 61 64 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  eader;..  assert
35b10 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
35b20 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
35b30 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
35b40 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65   pPage is not ne
35b50 63 65 73 73 61 72 69 6c 79 20 77 72 69 74 65 61  cessarily writea
35b60 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c 6c 20  ble since pCell 
35b70 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c 69 61  might be auxilia
35b80 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 73  ry.  ** buffer s
35b90 70 61 63 65 20 74 68 61 74 20 69 73 20 73 65 70  pace that is sep
35ba0 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65 20 70  arate from the p
35bb0 50 61 67 65 20 62 75 66 66 65 72 20 61 72 65 61  Page buffer area
35bc0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 43   */.  assert( pC
35bd0 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ell<pPage->aData
35be0 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67   || pCell>=&pPag
35bf0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
35c00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
35c10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
35c20 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
35c30 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
35c40 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Page) );..  /* F
35c50 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
35c60 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
35c70 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  = pPage->childPt
35c80 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70 50 61  rSize;.  if( pPa
35c90 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
35ca0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70 58 2d    nPayload = pX-
35cb0 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e 5a 65  >nData + pX->nZe
35cc0 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ro;.    pSrc = p
35cd0 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6e 53  X->pData;.    nS
35ce0 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61 3b 0a  rc = pX->nData;.
35cf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
35d00 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b  e->intKeyLeaf );
35d10 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29   /* fillInCell()
35d20 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 6f 72   only called for
35d30 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20 20 6e   leaves */.    n
35d40 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
35d50 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65  int32(&pCell[nHe
35d60 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ader], nPayload)
35d70 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  ;.    nHeader +=
35d80 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
35d90 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
35da0 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b 0a 20  4*)&pX->nKey);. 
35db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
35dc0 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d 30 78  rt( pX->nKey<=0x
35dd0 37 66 66 66 66 66 66 66 20 26 26 20 70 58 2d 3e  7fffffff && pX->
35de0 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e  pKey!=0 );.    n
35df0 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64 20 3d  Src = nPayload =
35e00 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79 3b 0a   (int)pX->nKey;.
35e10 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70      pSrc = pX->p
35e20 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64 65 72  Key;.    nHeader
35e30 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28   += putVarint32(
35e40 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
35e50 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 0a   nPayload);.  }.
35e60 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
35e70 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
35e80 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
35e90 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 69  ll[nHeader];.  i
35ea0 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61  f( nPayload<=pPa
35eb0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
35ec0 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
35ed0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
35ee0 68 65 72 65 20 65 76 65 72 79 74 68 69 6e 67 20  here everything 
35ef0 66 69 74 73 20 6f 6e 20 74 68 65 20 62 74 72 65  fits on the btre
35f00 65 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 61 6e  e page.    ** an
35f10 64 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  d no overflow pa
35f20 67 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  ges are required
35f30 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d 20 6e 48 65  . */.    n = nHe
35f40 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b  ader + nPayload;
35f50 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
35f60 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==3 );.    testc
35f70 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20  ase( n==4 );.   
35f80 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34   if( n<4 ) n = 4
35f90 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
35fa0 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  n;.    assert( n
35fb0 53 72 63 3c 3d 6e 50 61 79 6c 6f 61 64 20 29 3b  Src<=nPayload );
35fc0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
35fd0 53 72 63 3c 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  Src<nPayload );.
35fe0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
35ff0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 53 72 63 29  oad, pSrc, nSrc)
36000 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  ;.    memset(pPa
36010 79 6c 6f 61 64 2b 6e 53 72 63 2c 20 30 2c 20 6e  yload+nSrc, 0, n
36020 50 61 79 6c 6f 61 64 2d 6e 53 72 63 29 3b 0a 20  Payload-nSrc);. 
36030 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36040 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
36050 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
36060 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
36070 74 68 61 74 20 73 6f 6d 65 20 6f 66 20 74 68 65  that some of the
36080 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 6e 65   content will ne
36090 65 64 0a 20 20 2a 2a 20 74 6f 20 73 70 69 6c 6c  ed.  ** to spill
360a0 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
360b0 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 6d 6e 20  ages..  */.  mn 
360c0 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
360d0 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e  l;.  n = mn + (n
360e0 50 61 79 6c 6f 61 64 20 2d 20 6d 6e 29 20 25 20  Payload - mn) % 
360f0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
36100 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
36110 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61  testcase( n==pPa
36120 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  ge->maxLocal );.
36130 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
36140 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
36150 20 29 3b 0a 20 20 69 66 28 20 6e 20 3e 20 70 50   );.  if( n > pP
36160 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20  age->maxLocal ) 
36170 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70 61 63 65 4c  n = mn;.  spaceL
36180 65 66 74 20 3d 20 6e 3b 0a 20 20 2a 70 6e 53 69  eft = n;.  *pnSi
36190 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72  ze = n + nHeader
361a0 20 2b 20 34 3b 0a 20 20 70 50 72 69 6f 72 20 3d   + 4;.  pPrior =
361b0 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
361c0 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c 65 61 73 65  n];.  pToRelease
361d0 20 3d 20 30 3b 0a 20 20 70 67 6e 6f 4f 76 66 6c   = 0;.  pgnoOvfl
361e0 20 3d 20 30 3b 0a 20 20 70 42 74 20 3d 20 70 50   = 0;.  pBt = pP
361f0 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a 20  age->pBt;..  /* 
36200 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61  At this point va
36210 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62  riables should b
36220 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
36230 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50  :.  **.  **   nP
36240 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
36250 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   Total payload s
36260 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a  ize in bytes.  *
36270 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20  *   pPayload    
36280 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69         Begin wri
36290 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72  ting payload her
362a0 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65  e.  **   spaceLe
362b0 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63  ft          Spac
362c0 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70  e available at p
362d0 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61  Payload.  If nPa
362e0 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c  yload>spaceLeft,
362f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
36300 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
36310 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75  means content mu
36320 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76  st spill into ov
36330 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
36340 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20  **   *pnSize    
36350 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20          Size of 
36360 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28  the local cell (
36370 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65  not counting ove
36380 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a  rflow pages).  *
36390 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20  *   pPrior      
363a0 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20         Where to 
363b0 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f  write the pgno o
363c0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
363d0 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20  flow page.  **. 
363e0 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74   ** Use a call t
363f0 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
36400 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20  Ptr() to verify 
36410 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
36420 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20  above.  ** were 
36430 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74  computed correct
36440 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ly..  */.#ifdef 
36450 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
36460 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
36470 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78  fo;.    pPage->x
36480 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
36490 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
364a0 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61      assert( nHea
364b0 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  der==(int)(info.
364c0 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
364d0 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
364e0 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e   info.nKey==pX->
364f0 6e 4b 65 79 20 29 3b 0a 20 20 20 20 61 73 73 65  nKey );.    asse
36500 72 74 28 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69  rt( *pnSize == i
36510 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20  nfo.nSize );.   
36520 20 61 73 73 65 72 74 28 20 73 70 61 63 65 4c 65   assert( spaceLe
36530 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61  ft == info.nLoca
36540 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  l );.  }.#endif.
36550 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
36560 70 61 79 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65  payload into the
36570 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20   local Cell and 
36580 61 6e 79 20 65 78 74 72 61 20 69 6e 74 6f 20 6f  any extra into o
36590 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f  verflow pages */
365a0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
365b0 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
365c0 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
365d0 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
365e0 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
365f0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
36600 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
36610 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
36620 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
36630 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
36640 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
36650 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
36660 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
36670 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
36680 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
36690 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
366a0 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
366b0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
366c0 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
366d0 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
366e0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
366f0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
36700 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
36710 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
36720 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
36730 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
36740 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
36750 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
36760 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
36770 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
36780 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
36790 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
367a0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
367b0 20 20 20 20 69 66 28 20 6e 53 72 63 3e 3d 6e 20      if( nSrc>=n 
367c0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
367d0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
367e0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n);.    }else if
367f0 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ( nSrc>0 ){.    
36800 20 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20    n = nSrc;.    
36810 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
36820 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
36830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
36840 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
36850 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
36860 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
36870 20 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c     if( nPayload<
36880 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
36890 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20  pPayload += n;. 
368a0 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20     pSrc += n;.  
368b0 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20    nSrc -= n;.   
368c0 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b   spaceLeft -= n;
368d0 0a 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65  .    if( spaceLe
368e0 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4d  ft==0 ){.      M
368f0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
36900 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
36910 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
36920 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e  M.      Pgno pgn
36930 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76  oPtrmap = pgnoOv
36940 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20  fl; /* Overflow 
36950 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70  page pointer-map
36960 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20   entry page */. 
36970 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
36980 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
36990 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
369a0 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20    pgnoOvfl++;.  
369b0 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a        } while( .
369c0 20 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50            PTRMAP
369d0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e  _ISPAGE(pBt, pgn
369e0 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76  oOvfl) || pgnoOv
369f0 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  fl==PENDING_BYTE
36a00 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20  _PAGE(pBt) .    
36a10 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23      );.      }.#
36a20 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
36a30 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
36a40 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
36a50 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
36a60 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66  vfl, 0);.#ifndef
36a70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
36a80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
36a90 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
36aa0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
36ab0 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
36ac0 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
36ad0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
36ae0 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
36af0 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
36b00 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
36b10 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
36b20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
36b30 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
36b40 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
36b50 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
36b60 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
36b70 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
36b80 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
36b90 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
36ba0 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
36bb0 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
36bc0 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
36bd0 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
36be0 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
36bf0 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
36c00 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
36c10 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
36c20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
36c30 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
36c40 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  nitialized value
36c50 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
36c60 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
36c70 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
36c80 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
36c90 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
36ca0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
36cb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36cc0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
36cd0 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
36ce0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
36cf0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
36d00 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
36d10 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76  pPut(pBt, pgnoOv
36d20 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50  fl, eType, pgnoP
36d30 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20 20 20  trmap, &rc);.   
36d40 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
36d50 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
36d60 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
36d70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
36d80 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
36d90 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
36da0 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
36db0 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
36dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
36dd0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  }..      /* If p
36de0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
36df0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72 69 6f   zero than pPrio
36e00 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  r points into th
36e10 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
36e20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
36e30 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
36e40 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
36e50 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
36e60 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
36e70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
36e80 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
36e90 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
36ea0 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
36eb0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 50 72  .      /* If pPr
36ec0 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66 20 74  ior is part of t
36ed0 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
36ee0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
36ef0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
36f00 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72    ** is still wr
36f10 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  iteable */.     
36f20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 3c   assert( pPrior<
36f30 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
36f40 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65 2d 3e  pPrior>=&pPage->
36f50 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
36f60 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
36f70 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
36f80 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
36f90 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
36fa0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
36fb0 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66 6c 29  Prior, pgnoOvfl)
36fc0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
36fd0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
36fe0 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65 61 73  .      pToReleas
36ff0 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20 20 20  e = pOvfl;.     
37000 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66 6c 2d   pPrior = pOvfl-
37010 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 70 75  >aData;.      pu
37020 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 30  t4byte(pPrior, 0
37030 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c 6f 61  );.      pPayloa
37040 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44 61 74  d = &pOvfl->aDat
37050 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70 61 63  a[4];.      spac
37060 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75 73 61  eLeft = pBt->usa
37070 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20  bleSize - 4;.   
37080 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
37090 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
370a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
370b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
370c0 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20 63  emove the i-th c
370d0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 20  ell from pPage. 
370e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 66   This routine ef
370f0 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c 79  fects pPage only
37100 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63 6f  ..** The cell co
37110 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72 65  ntent is not fre
37120 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74 65  ed or deallocate
37130 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d 65  d.  It is assume
37140 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 65  d that.** the ce
37150 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62  ll content has b
37160 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65 70  een copied somep
37170 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69 73  lace else.  This
37180 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a 2a   routine just.**
37190 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65 66   removes the ref
371a0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 65  erence to the ce
371b0 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 2a  ll from pPage..*
371c0 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20 62  *.** "sz" must b
371d0 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
371e0 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65 6c  bytes in the cel
371f0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
37200 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50 61  d dropCell(MemPa
37210 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
37220 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20  dx, int sz, int 
37230 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63 3b  *pRC){.  u32 pc;
37240 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
37250 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65  et to cell conte
37260 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67  nt of cell being
37270 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38   deleted */.  u8
37280 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a   *data;       /*
37290 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
372a0 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20  .  u8 *ptr;     
372b0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f     /* Used to mo
372c0 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20  ve bytes around 
372d0 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  within data[] */
372e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
372f0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
37300 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 68   code */.  int h
37310 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 65  dr;        /* Be
37320 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 68  ginning of the h
37330 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20 70  eader.  0 most p
37340 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65 20  ages.  100 page 
37350 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  1 */..  if( *pRC
37360 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
37370 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
37380 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
37390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
373a0 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d 3d 63  RUPT_DB || sz==c
373b0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69  ellSize(pPage, i
373c0 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  dx) );.  assert(
373d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
373e0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
373f0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
37400 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
37410 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
37420 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
37430 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
37440 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 70  Data;.  ptr = &p
37450 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  Page->aCellIdx[2
37460 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
37470 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 68  t2byte(ptr);.  h
37480 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
37490 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61 73  ffset;.  testcas
374a0 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65 28  e( pc==get2byte(
374b0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b  &data[hdr+5]) );
374c0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63 2b  .  testcase( pc+
374d0 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  sz==pPage->pBt->
374e0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
374f0 69 66 28 20 70 63 2b 73 7a 20 3e 20 70 50 61 67  if( pc+sz > pPag
37500 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
37510 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  ze ){.    *pRC =
37520 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
37530 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
37540 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
37550 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
37560 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 20  , sz);.  if( rc 
37570 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63  ){.    *pRC = rc
37580 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
37590 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
375a0 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  --;.  if( pPage-
375b0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
375c0 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
375d0 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20  r+1], 0, 4);.   
375e0 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
375f0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
37600 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61  data[hdr+5], pPa
37610 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
37620 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ize);.    pPage-
37630 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d 3e  >nFree = pPage->
37640 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
37650 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  - pPage->hdrOffs
37660 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  et.             
37670 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61 67            - pPag
37680 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
37690 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  - 8;.  }else{.  
376a0 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70    memmove(ptr, p
376b0 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e  tr+2, 2*(pPage->
376c0 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20  nCell - idx));. 
376d0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
376e0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d  a[hdr+3], pPage-
376f0 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61  >nCell);.    pPa
37700 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a  ge->nFree += 2;.
37710 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73    }.}../*.** Ins
37720 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f  ert a new cell o
37730 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20  n pPage at cell 
37740 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c  index "i".  pCel
37750 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a  l points to the.
37760 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  ** content of th
37770 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  e cell..**.** If
37780 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
37790 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
377a0 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74  e page, then put
377b0 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20 69   it there.  If i
377c0 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69  t.** will not fi
377d0 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63  t, then make a c
377e0 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  opy of the cell 
377f0 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65  content into pTe
37800 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69  mp if.** pTemp i
37810 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67  s not null.  Reg
37820 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70  ardless of pTemp
37830 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  , allocate a new
37840 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61   entry.** in pPa
37850 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64  ge->apOvfl[] and
37860 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20 74   make it point t
37870 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
37880 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e  nt (either.** in
37890 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f 72   pTemp or the or
378a0 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e  iginal pCell) an
378b0 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69 74  d also record it
378c0 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c  s index. .** All
378d0 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65 6e  ocating a new en
378e0 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  try in pPage->aC
378f0 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68  ell[] implies th
37900 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f  at .** pPage->nO
37910 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72 65  verflow is incre
37920 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70  mented..**.** *p
37930 52 43 20 6d 75 73 74 20 62 65 20 53 51 4c 49 54  RC must be SQLIT
37940 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 72  E_OK when this r
37950 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
37960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37970 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d   insertCell(.  M
37980 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
37990 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68   /* Page into wh
379a0 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69  ich we are copyi
379b0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20  ng */.  int i,  
379c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
379d0 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68   cell becomes th
379e0 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74  e i-th cell of t
379f0 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  he page */.  u8 
37a00 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f  *pCell,        /
37a10 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
37a20 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   new cell */.  i
37a30 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20  nt sz,          
37a40 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e   /* Bytes of con
37a50 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f  tent in pCell */
37a60 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20  .  u8 *pTemp,   
37a70 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f       /* Temp sto
37a80 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70  rage space for p
37a90 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20  Cell, if needed 
37aa0 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64  */.  Pgno iChild
37ab0 2c 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e  ,      /* If non
37ac0 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66  -zero, replace f
37ad0 69 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74  irst 4 bytes wit
37ae0 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a  h this value */.
37af0 20 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20    int *pRC      
37b00 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20      /* Read and 
37b10 77 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64  write return cod
37b20 65 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29  e from here */.)
37b30 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b  {.  int idx = 0;
37b40 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
37b50 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
37b60 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
37b70 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
37b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
37b90 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
37ba0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
37bb0 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
37bc0 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
37bd0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b  e */.  u8 *pIns;
37be0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
37bf0 70 6f 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e  point in pPage->
37c00 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65  aCellIdx[] where
37c10 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65   no cell inserte
37c20 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
37c30 2a 70 52 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRC==SQLITE_OK 
37c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d  );.  assert( i>=
37c50 30 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e  0 && i<=pPage->n
37c60 43 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65  Cell+pPage->nOve
37c70 72 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72  rflow );.  asser
37c80 74 28 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  t( MX_CELL(pPage
37c90 2d 3e 70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b  ->pBt)<=10921 );
37ca0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
37cb0 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c  ->nCell<=MX_CELL
37cc0 28 70 50 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20  (pPage->pBt) || 
37cd0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
37ce0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
37cf0 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
37d00 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
37d10 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
37d20 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d  ArraySize(pPage-
37d30 3e 61 70 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53  >apOvfl)==ArrayS
37d40 69 7a 65 28 70 50 61 67 65 2d 3e 61 69 4f 76 66  ize(pPage->aiOvf
37d50 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  l) );.  assert( 
37d60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
37d70 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
37d80 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
37d90 65 20 63 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f  e cell should no
37da0 72 6d 61 6c 6c 79 20 62 65 20 73 69 7a 65 64 20  rmally be sized 
37db0 63 6f 72 72 65 63 74 6c 79 2e 20 20 48 6f 77 65  correctly.  Howe
37dc0 76 65 72 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67  ver, when moving
37dd0 20 61 0a 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65   a.  ** malforme
37de0 64 20 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65  d cell from a le
37df0 61 66 20 70 61 67 65 20 74 6f 20 61 6e 20 69 6e  af page to an in
37e00 74 65 72 69 6f 72 20 70 61 67 65 2c 20 69 66 20  terior page, if 
37e10 74 68 65 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20  the cell size.  
37e20 2a 2a 20 77 61 6e 74 65 64 20 74 6f 20 62 65 20  ** wanted to be 
37e30 6c 65 73 73 20 74 68 61 6e 20 34 20 62 75 74 20  less than 4 but 
37e40 67 6f 74 20 72 6f 75 6e 64 65 64 20 75 70 20 74  got rounded up t
37e50 6f 20 34 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c  o 4 on the leaf,
37e60 20 74 68 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20   then size.  ** 
37e70 6d 69 67 68 74 20 62 65 20 6c 65 73 73 20 74 68  might be less th
37e80 61 6e 20 38 20 28 6c 65 61 66 2d 73 69 7a 65 20  an 8 (leaf-size 
37e90 2b 20 70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68  + pointer) on th
37ea0 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e  e interior node.
37eb0 20 20 48 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65    Hence.  ** the
37ec0 20 74 65 72 6d 20 61 66 74 65 72 20 74 68 65 20   term after the 
37ed0 7c 7c 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  || in the follow
37ee0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 2a 2f  ing assert(). */
37ef0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 70  .  assert( sz==p
37f00 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
37f10 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c  pPage, pCell) ||
37f20 20 28 73 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c   (sz==8 && iChil
37f30 64 3e 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  d>0) );.  if( pP
37f40 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
37f50 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
37f60 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
37f70 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
37f80 6d 63 70 79 28 70 54 65 6d 70 2c 20 70 43 65 6c  mcpy(pTemp, pCel
37f90 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 70 43  l, sz);.      pC
37fa0 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
37fb0 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c   }.    if( iChil
37fc0 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  d ){.      put4b
37fd0 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c  yte(pCell, iChil
37fe0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20  d);.    }.    j 
37ff0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
38000 6f 77 2b 2b 3b 0a 20 20 20 20 2f 2a 20 43 6f 6d  ow++;.    /* Com
38010 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
38020 41 72 72 61 79 53 69 7a 65 2d 31 20 73 69 6e 63  ArraySize-1 sinc
38030 65 20 77 65 20 68 6f 6c 64 20 62 61 63 6b 20 6f  e we hold back o
38040 6e 65 20 65 78 74 72 61 20 73 6c 6f 74 0a 20 20  ne extra slot.  
38050 20 20 2a 2a 20 61 73 20 61 20 63 6f 6e 74 69 6e    ** as a contin
38060 67 65 6e 63 79 2e 20 20 49 6e 20 6f 74 68 65 72  gency.  In other
38070 20 77 6f 72 64 73 2c 20 6e 65 76 65 72 20 6e 65   words, never ne
38080 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 33 20 6f  ed more than 3 o
38090 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 73  verflow.    ** s
380a0 6c 6f 74 73 20 62 75 74 20 34 20 61 72 65 20 61  lots but 4 are a
380b0 6c 6c 6f 63 61 74 65 64 2c 20 6a 75 73 74 20 74  llocated, just t
380c0 6f 20 62 65 20 73 61 66 65 2e 20 2a 2f 0a 20 20  o be safe. */.  
380d0 20 20 61 73 73 65 72 74 28 20 6a 20 3c 20 41 72    assert( j < Ar
380e0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
380f0 70 4f 76 66 6c 29 2d 31 20 29 3b 0a 20 20 20 20  pOvfl)-1 );.    
38100 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d  pPage->apOvfl[j]
38110 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50   = pCell;.    pP
38120 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d  age->aiOvfl[j] =
38130 20 28 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a   (u16)i;..    /*
38140 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f   When multiple o
38150 76 65 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20  verflows occur, 
38160 74 68 65 79 20 61 72 65 20 61 6c 77 61 79 73 20  they are always 
38170 73 65 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69  sequential and i
38180 6e 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20  n.    ** sorted 
38190 6f 72 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76  order.  This inv
381a0 61 72 69 61 6e 74 73 20 61 72 69 73 65 20 62 65  ariants arise be
381b0 63 61 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f  cause multiple o
381c0 76 65 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20  verflows can.   
381d0 20 2a 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77   ** only occur w
381e0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69  hen inserting di
381f0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
38200 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
38210 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62   during.    ** b
38220 61 6c 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68  alancing, and th
38230 65 20 64 69 76 69 64 65 72 73 20 61 72 65 20 61  e dividers are a
38240 64 6a 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74  djacent and sort
38250 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ed..    */.    a
38260 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70  ssert( j==0 || p
38270 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31  Page->aiOvfl[j-1
38280 5d 3c 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f  ]<(u16)i ); /* O
38290 76 65 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74  verflows in sort
382a0 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
382b0 61 73 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20  assert( j==0 || 
382c0 69 3d 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c  i==pPage->aiOvfl
382d0 5b 6a 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20  [j-1]+1 );   /* 
382e0 4f 76 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65  Overflows are se
382f0 71 75 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65  quential */.  }e
38300 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
38310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
38320 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
38330 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
38340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
38350 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
38360 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
38370 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73   }.    assert( s
38380 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
38390 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
383a0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61  bPage) );.    da
383b0 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
383c0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  a;.    assert( &
383d0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c  data[pPage->cell
383e0 4f 66 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e  Offset]==pPage->
383f0 61 43 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20  aCellIdx );.    
38400 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  rc = allocateSpa
38410 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69  ce(pPage, sz, &i
38420 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  dx);.    if( rc 
38430 29 7b 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65  ){ *pRC = rc; re
38440 74 75 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54  turn; }.    /* T
38450 68 65 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65  he allocateSpace
38460 28 29 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61  () routine guara
38470 6e 74 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ntees the follow
38480 69 6e 67 20