/ Hex Artifact Content
Login

Artifact 258d048e423c23398ee29a4fce043839e47ab483:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
3110: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
3120: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
3130: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
3140: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
3150: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
3160: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
3170: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
3180: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
3190: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
31a0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
31b0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
31c0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
31d0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
31e0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
31f0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3200: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3210: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3220: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3230: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3240: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3250: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
3260: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
3270: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
3280: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
3290: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
32a0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
32b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
32c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
32e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
32f0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3300: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3310: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3320: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3330: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3340: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3350: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
3360: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
3370: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
3380: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
3390: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
33c0: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
33d0: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
33e0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
33f0: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3400: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3410: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3420: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3430: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3440: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3450: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3460: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3470: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3480: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3490: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
34a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
34b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
34c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
34d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
34f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3500: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3510: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3520: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3530: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3540: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3550: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
3560: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
3570: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
3580: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
3590: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
35a0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
35b0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
35c0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
35d0: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
35e0: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
35f0: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3600: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3610: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3620: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3630: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3640: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3650: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
3660: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3670: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
3680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3690: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
36a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
36b0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
36c0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
36d0: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
36e0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
36f0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3700: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3710: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3720: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3730: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3740: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3750: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
3760: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
3770: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
3780: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
3790: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
37a0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
37b0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
37c0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
37d0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
37e0: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
37f0: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3800: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3810: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3820: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3830: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3840: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3850: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
3860: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
3870: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
3880: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
3890: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
38a0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
38b0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
38c0: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
38d0: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
38e0: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
38f0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3900: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3910: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3920: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3930: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3940: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3950: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
3960: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3970: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
3980: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
3990: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
39a0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
39b0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
39c0: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
39d0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
39e0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
39f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3a00: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3a10: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3a20: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3a30: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3a40: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3a50: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3a60: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3a70: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3a80: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
3a90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
3aa0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
3ab0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3ac0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3ad0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3ae0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3af0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3b00: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3b10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3b20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3b30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3b40: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3b50: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3b60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3b70: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
3b80: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
3b90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ba0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
3bb0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3bc0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3bd0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3be0: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3bf0: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3c00: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3c10: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3c20: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3c30: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3c40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3c50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3c70: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3c80: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 42  orOwnsBtShared(B
3c90: 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61  tCursor *p){.  a
3ca0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
3cb0: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
3cc0: 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 72 65  return (p->pBtre
3cd0: 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64  e->db==p->pBt->d
3ce0: 62 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  b);.}.#endif../*
3cf0: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
3d00: 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
3d10: 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 20  e of the cursor 
3d20: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
3d30: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
3d40: 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62   on the shared b
3d50: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70  tree structure p
3d60: 42 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  Bt..*/.#define i
3d70: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
3d80: 77 43 61 63 68 65 28 70 43 75 72 29 20 28 70 43  wCache(pCur) (pC
3d90: 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
3da0: 7e 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  ~BTCF_ValidOvfl)
3db0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
3dc0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
3dd0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
3de0: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
3df0: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
3e00: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
3e10: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
3e20: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
3e30: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
3e40: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
3e50: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
3e60: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
3e70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
3e80: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
3e90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3ea0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61  pNext){.    inva
3ec0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
3ed0: 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  che(p);.  }.}..#
3ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3ef0: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
3f00: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3f10: 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  is called before
3f20: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 63   modifying the c
3f30: 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61 62  ontents of a tab
3f40: 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64  le.** to invalid
3f50: 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
3f60: 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
3f70: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a  e open on the.**
3f80: 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74   row or one of t
3f90: 68 65 20 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f  he rows being mo
3fa0: 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  dified..**.** If
3fb0: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3fc0: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
3fd0: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
3fe0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
3ff0: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
4000: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
4010: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
4020: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
4030: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
4040: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
4050: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
4060: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
4070: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
4080: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
4090: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
40a0: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
40b0: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
40c0: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
40d0: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
40e0: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
40f0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
4100: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
4110: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
4120: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74  ors open on that
4130: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
4140: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
4150: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
4160: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
4170: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
4180: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
4190: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
41a0: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 2c 20   */.  i64 iRow, 
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41c0: 20 54 68 65 20 72 6f 77 69 64 20 74 68 61 74 20   The rowid that 
41d0: 6d 69 67 68 74 20 62 65 20 63 68 61 6e 67 69 6e  might be changin
41e0: 67 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65  g */.  int isCle
41f0: 61 72 54 61 62 6c 65 20 20 20 20 20 20 20 20 2f  arTable        /
4200: 2a 20 54 72 75 65 20 69 66 20 61 6c 6c 20 72 6f  * True if all ro
4210: 77 73 20 61 72 65 20 62 65 69 6e 67 20 64 65 6c  ws are being del
4220: 65 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43  eted */.){.  BtC
4230: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20  ursor *p;.  if( 
4240: 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62  pBtree->hasIncrb
4250: 6c 6f 62 43 75 72 3d 3d 30 20 29 20 72 65 74 75  lobCur==0 ) retu
4260: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rn;.  assert( sq
4270: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
4280: 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
4290: 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e 63    pBtree->hasInc
42a0: 72 62 6c 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20  rblobCur = 0;.  
42b0: 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
42c0: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
42d0: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
42e0: 69 66 28 20 28 70 2d 3e 63 75 72 46 6c 61 67 73  if( (p->curFlags
42f0: 20 26 20 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62   & BTCF_Incrblob
4300: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
4310: 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f  tree->hasIncrblo
4320: 62 43 75 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  bCur = 1;.      
4330: 69 66 28 20 69 73 43 6c 65 61 72 54 61 62 6c 65  if( isClearTable
4340: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
4350: 3d 3d 69 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  ==iRow ){.      
4360: 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
4370: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
4380: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4390: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
43a0: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
43b0: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
43c0: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
43d0: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
43e0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 78 2c 79 2c  blobCursors(x,y,
43f0: 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
4400: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
4410: 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  B */../*.** Set 
4420: 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  bit pgno of the 
4430: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4440: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
4450: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  s is called .** 
4460: 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74  when a page that
4470: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74   previously cont
4480: 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d  ained data becom
4490: 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  es a free-list l
44a0: 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a  eaf .** page..**
44b0: 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64  .** The BtShared
44c0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
44d0: 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f  vec exists to wo
44e0: 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73  rk around an obs
44f0: 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73  cure.** bug caus
4500: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61  ed by the intera
4510: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65  ction of two use
4520: 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74  ful IO optimizat
4530: 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ions surrounding
4540: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  .** free-list le
4550: 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20  af pages:.**.** 
4560: 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61    1) When all da
4570: 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ta is deleted fr
4580: 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68  om a page and th
4590: 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a  e page becomes.*
45a0: 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69  *      a free-li
45b0: 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68  st leaf page, th
45c0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72  e page is not wr
45d0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
45e0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61  abase.**      (a
45f0: 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  s free-list leaf
4600: 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e   pages contain n
4610: 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74  o meaningful dat
4620: 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a  a). Sometimes.**
4630: 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67        such a pag
4640: 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f  e is not even jo
4650: 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20  urnalled (as it 
4660: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69  will not be modi
4670: 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68  fied,.**      wh
4680: 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  y bother journal
4690: 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a  ling it?)..**.**
46a0: 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65     2) When a fre
46b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
46c0: 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20   is reused, its 
46d0: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72  content is not r
46e0: 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
46f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
4700: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4710: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68  journal file (wh
4720: 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20  y should it.**  
4730: 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73      be, if it is
4740: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e   not at all mean
4750: 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ingful?)..**.** 
4760: 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74  By themselves, t
4770: 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
4780: 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64  ns work fine and
4790: 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79   provide a handy
47a0: 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
47b0: 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65  boost to bulk de
47c0: 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f  lete or insert o
47d0: 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76  perations. Howev
47e0: 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65  er, if.** a page
47f0: 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   is moved to the
4800: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74   free-list and t
4810: 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69  hen reused withi
4820: 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72  n the same.** tr
4830: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f  ansaction, a pro
4840: 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49  blem comes up. I
4850: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
4860: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
4870: 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64  n.** it is moved
4880: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
4890: 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f  t and it is also
48a0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
48b0: 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78  when it.** is ex
48c0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
48d0: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72   free-list and r
48e0: 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20  eused, then the 
48f0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a  original data.**
4900: 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e   may be lost. In
4910: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
4920: 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79  rollback, it may
4930: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
4940: 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
4950: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
4960: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
4970: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  iguration..**.**
4980: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
4990: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
49a0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
49b0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67  . Whenever a pag
49c0: 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74  e is .** moved t
49d0: 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d  o become a free-
49e0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
49f0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4a00: 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20  g bit is.** set 
4a10: 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57  in the bitvec. W
4a20: 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70  henever a leaf p
4a30: 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64  age is extracted
4a40: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
4a50: 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  ist,.** optimiza
4a60: 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20  tion 2 above is 
4a70: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 63  omitted if the c
4a80: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4a90: 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73   is already.** s
4aa0: 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e 70  et in BtShared.p
4ab0: 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20  HasContent. The 
4ac0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
4ad0: 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61 72  bitvec are clear
4ae0: 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  ed.** at the end
4af0: 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73 61   of every transa
4b00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
4b10: 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61 73   int btreeSetHas
4b20: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4b30: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
4b40: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
4b50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21  LITE_OK;.  if( !
4b60: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4b70: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4b80: 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65  pgno<=pBt->nPage
4b90: 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 48 61   );.    pBt->pHa
4ba0: 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74  sContent = sqlit
4bb0: 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
4bc0: 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
4bd0: 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f  if( !pBt->pHasCo
4be0: 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72  ntent ){.      r
4bf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4c00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
4c10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4c20: 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33  && pgno<=sqlite3
4c30: 42 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e  BitvecSize(pBt->
4c40: 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a  pHasContent) ){.
4c50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
4c60: 42 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70  BitvecSet(pBt->p
4c70: 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f  HasContent, pgno
4c80: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
4c90: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65  rc;.}../*.** Que
4ca0: 72 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ry the BtShared.
4cb0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74  pHasContent vect
4cc0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  or..**.** This f
4cd0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4ce0: 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  d when a free-li
4cf0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
4d00: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
4d10: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f  .** free-list fo
4d20: 72 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75  r reuse. It retu
4d30: 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20  rns false if it 
4d40: 69 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69  is safe to retri
4d50: 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  eve the.** page 
4d60: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c  from the pager l
4d70: 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
4d80: 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
4d90: 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77  set. True otherw
4da0: 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
4db0: 6e 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f  nt btreeGetHasCo
4dc0: 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a  ntent(BtShared *
4dd0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
4de0: 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70  .  Bitvec *p = p
4df0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b  Bt->pHasContent;
4e00: 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20  .  return (p && 
4e10: 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74  (pgno>sqlite3Bit
4e20: 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71  vecSize(p) || sq
4e30: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
4e40: 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f  p, pgno)));.}../
4e50: 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74  *.** Clear (dest
4e60: 72 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65  roy) the BtShare
4e70: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69  d.pHasContent bi
4e80: 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c  tvec. This shoul
4e90: 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20  d be.** invoked 
4ea0: 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f  at the conclusio
4eb0: 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d  n of each write-
4ec0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
4ed0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
4ee0: 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
4ef0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
4f00: 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
4f10: 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61  Destroy(pBt->pHa
4f20: 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74  sContent);.  pBt
4f30: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20  ->pHasContent = 
4f40: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  0;.}../*.** Rele
4f50: 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61  ase all of the a
4f60: 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f  pPage[] pages fo
4f70: 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73  r a cursor..*/.s
4f80: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
4f90: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
4fa0: 50 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a  Pages(BtCursor *
4fb0: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pCur){.  int i;.
4fc0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
4fd0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
4fe0: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
4ff0: 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
5000: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  );.    pCur->apP
5010: 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a  age[i] = 0;.  }.
5020: 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
5030: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  -1;.}../*.** The
5040: 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
5050: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
5060: 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74  ent must point t
5070: 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a  o a valid entry.
5080: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
5090: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
50a0: 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74  (i.e. have eStat
50b0: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
50c0: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
50d0: 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72  on saves the cur
50e0: 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20  rent cursor key 
50f0: 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75  in variables pCu
5100: 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70  r->nKey and.** p
5110: 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54  Cur->pKey. SQLIT
5120: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
5130: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f   if successful o
5140: 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
5150: 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  r .** code other
5160: 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  wise..**.** If t
5170: 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65  he cursor is ope
5180: 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74  n on an intkey t
5190: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69  able, then the i
51a0: 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74  nteger key.** (t
51b0: 68 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f  he rowid) is sto
51c0: 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  red in pCur->nKe
51d0: 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79  y and pCur->pKey
51e0: 20 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a   is left set to.
51f0: 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20  ** NULL. If the 
5200: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5210: 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74  n a non-intkey t
5220: 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d  able, then pCur-
5230: 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74  >pKey is .** set
5240: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d   to point to a m
5250: 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70  alloced buffer p
5260: 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20  Cur->nKey bytes 
5270: 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
5280: 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a  ng .** the key..
5290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
52a0: 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75  veCursorKey(BtCu
52b0: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
52c0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
52d0: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
52e0: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
52f0: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
5300: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
5310: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5320: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
5330: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
5340: 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
5350: 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20 20  &pCur->nKey);.  
5360: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
5370: 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b 65 79  TE_OK );  /* Key
5380: 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20 66 61  Size() cannot fa
5390: 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  il */..  /* If t
53a0: 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79  his is an intKey
53b0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
53c0: 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42   above call to B
53d0: 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20  treeKeySize().  
53e0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e  ** stores the in
53f0: 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75  teger key in pCu
5400: 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73  r->nKey. In this
5410: 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75 65   case this value
5420: 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61   is.  ** all tha
5430: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f  t is required. O
5440: 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
5450: 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e  r is not open on
5460: 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20   an intKey.  ** 
5470: 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c  table, then mall
5480: 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  oc space for and
5490: 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d   store the pCur-
54a0: 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b  >nKey bytes of k
54b0: 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 20 20  ey .  ** data.  
54c0: 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43 75 72  */.  if( 0==pCur
54d0: 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b 0a 20  ->curIntKey ){. 
54e0: 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20     void *pKey = 
54f0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70  sqlite3Malloc( p
5500: 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  Cur->nKey );.   
5510: 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
5520: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5530: 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
5540: 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79   (int)pCur->nKey
5550: 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69  , pKey);.      i
5560: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5570: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
5580: 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20  ->pKey = pKey;. 
5590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
55a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
55b0: 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a  (pKey);.      }.
55c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
55d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
55e0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  EM;.    }.  }.  
55f0: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5600: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5610: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5620: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5630: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5640: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5650: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5660: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5670: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5680: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5690: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
56a0: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
56b0: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
56c0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
56d0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
56e0: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
56f0: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5700: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5710: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5720: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5730: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5740: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5750: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5760: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5770: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5780: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5790: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
57a0: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
57b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
57c0: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
57d0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
57e0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
57f0: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5800: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5810: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5820: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5830: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5840: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5850: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5860: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5870: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5880: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5890: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
58a0: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
58b0: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
58c0: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
58d0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
58e0: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
58f0: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5900: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5910: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5920: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5930: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5940: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5950: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5960: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5970: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5980: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
5990: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
59a0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
59b0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
59c0: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
59d0: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
59e0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
59f0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
5a00: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
5a10: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
5a20: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
5a30: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
5a40: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
5a50: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
5a60: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
5a70: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
5a80: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
5a90: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
5aa0: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
5ab0: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
5ac0: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
5ad0: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
5ae0: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
5af0: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
5b00: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
5b10: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
5b20: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
5b30: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
5b40: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
5b50: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
5b60: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
5b70: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
5b80: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
5b90: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
5ba0: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
5bb0: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
5bc0: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
5bd0: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
5be0: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
5bf0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
5c00: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
5c10: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
5c20: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
5c30: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
5c40: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
5c50: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
5c60: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
5c70: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
5c80: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
5c90: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
5ca0: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
5cb0: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
5cc0: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
5cd0: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
5ce0: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
5cf0: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
5d00: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
5d10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
5d20: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
5d30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
5d40: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
5d50: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
5d60: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
5d70: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
5d80: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
5d90: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
5da0: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
5db0: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
5dc0: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
5dd0: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
5de0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5df0: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
5e00: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
5e10: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
5e20: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
5e30: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
5e40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5e50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
5e60: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
5e70: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
5e80: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
5e90: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
5ea0: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
5eb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
5ec0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
5ed0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
5ee0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
5ef0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
5f00: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
5f10: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
5f20: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
5f30: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
5f40: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
5f50: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
5f60: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
5f70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5f80: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
5f90: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
5fa0: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
5fb0: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
5fc0: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
5fd0: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
5fe0: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
5ff0: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6000: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6010: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6020: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
6030: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
6040: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
6050: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
6060: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
6070: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
6080: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6090: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
60a0: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
60b0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
60c0: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
60d0: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
60e0: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
60f0: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6100: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6110: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6120: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
6130: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
6140: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
6150: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
6160: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
6170: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
6180: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6190: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
61a0: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
61b0: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
61c0: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
61d0: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
61e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
61f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6200: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6210: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6220: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
6230: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
6240: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
6250: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
6260: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
6270: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6280: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6290: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
62a0: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
62b0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74  >0 );.        bt
62c0: 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
62d0: 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
62e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
62f0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
6300: 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65  while( p );.  re
6310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6320: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  }../*.** Clear t
6330: 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f  he current curso
6340: 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76  r position..*/.v
6350: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
6360: 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75  ClearCursor(BtCu
6370: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
6380: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
6390: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
63a0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
63b0: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70  pCur->pKey);.  p
63c0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20  Cur->pKey = 0;. 
63d0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
63e0: 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
63f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  }../*.** In this
6400: 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65   version of Btre
6410: 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73  eMoveto, pKey is
6420: 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20   a packed index 
6430: 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61  record.** such a
6440: 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62  s is generated b
6450: 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63  y the OP_MakeRec
6460: 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70  ord opcode.  Unp
6470: 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72  ack the.** recor
6480: 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20  d and then call 
6490: 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
64a0: 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20  ked() to do the 
64b0: 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  work..*/.static 
64c0: 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28  int btreeMoveto(
64d0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
64e0: 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  r,     /* Cursor
64f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72   open on the btr
6500: 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65  ee to be searche
6510: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
6520: 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61  d *pKey,   /* Pa
6530: 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20  cked key if the 
6540: 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65  btree is an inde
6550: 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c  x */.  i64 nKey,
6560: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
6570: 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61  teger key for ta
6580: 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70  bles.  Size of p
6590: 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20  Key for indices 
65a0: 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20  */.  int bias,  
65b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73           /* Bias
65c0: 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
65d0: 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
65e0: 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
65f0: 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
6600: 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
6610: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20   /* Status code 
6640: 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
6650: 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20  ord *pIdxKey;   
6660: 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
6670: 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20  x key */.  char 
6680: 61 53 70 61 63 65 5b 32 30 30 5d 3b 20 20 20 20  aSpace[200];    
6690: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70        /* Temp sp
66a0: 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20  ace for pIdxKey 
66b0: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c  - to avoid a mal
66c0: 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70  loc */.  char *p
66d0: 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Free = 0;..  if(
66e0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
66f0: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6700: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6710: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6720: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
6730: 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20 20 20  kedRecord(.     
6740: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66     pCur->pKeyInf
6750: 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f  o, aSpace, sizeo
6760: 66 28 61 53 70 61 63 65 29 2c 20 26 70 46 72 65  f(aSpace), &pFre
6770: 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  e.    );.    if(
6780: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
67a0: 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  M;.    sqlite3Vd
67b0: 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
67c0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
67d0: 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 20  int)nKey, pKey, 
67e0: 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69 66  pIdxKey);.    if
67f0: 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65 6c  ( pIdxKey->nFiel
6800: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  d==0 ){.      sq
6810: 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72  lite3DbFree(pCur
6820: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20  ->pKeyInfo->db, 
6830: 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 72 65  pFree);.      re
6840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6850: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
6860: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
6870: 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
6880: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
6890: 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
68a0: 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
68b0: 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
68c0: 3b 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  ;.  if( pFree ){
68d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
68e0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
68f0: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
6900: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
6910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65  }../*.** Restore
6920: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
6930: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77  he position it w
6940: 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f  as in (or as clo
6950: 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c  se to as possibl
6960: 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43  e).** when saveC
6970: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
6980: 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65  was called. Note
6990: 20 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20   that this call 
69a0: 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20  deletes the .** 
69b0: 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69  saved position i
69c0: 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61  nfo stored by sa
69d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
69e0: 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e  (), so there can
69f0: 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f   be.** at most o
6a00: 6e 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73  ne effective res
6a10: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6a20: 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20  on() call after 
6a30: 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72  each .** saveCur
6a40: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a  sorPosition()..*
6a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
6a60: 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
6a70: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
6a80: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
6a90: 63 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78  c;.  int skipNex
6aa0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  t;.  assert( cur
6ab0: 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
6ac0: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
6ad0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
6ae0: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
6af0: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
6b00: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
6b10: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
6b20: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
6b30: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Next;.  }.  pCur
6b40: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6b50: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
6b60: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
6b70: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
6b80: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
6b90: 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28  skipNext);.  if(
6ba0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6bb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
6bc0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
6bd0: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
6be0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
6bf0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6c00: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
6c10: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
6c20: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
6c30: 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
6c40: 20 7c 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20   |= skipNext;.  
6c50: 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
6c60: 4e 65 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53  Next && pCur->eS
6c70: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6c80: 49 44 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ID ){.      pCur
6c90: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6ca0: 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20  R_SKIPNEXT;.    
6cb0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
6cc0: 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65  c;.}..#define re
6cd0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
6ce0: 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65  ion(p) \.  (p->e
6cf0: 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
6d00: 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20  QUIRESEEK ? \.  
6d10: 20 20 20 20 20 20 20 62 74 72 65 65 52 65 73 74         btreeRest
6d20: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
6d30: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
6d40: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
6d50: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
6d60: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
6d70: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
6d80: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
6d90: 6e 20 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61  n where.** it wa
6da0: 73 20 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f  s last placed, o
6db0: 72 20 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c  r has been inval
6dc0: 69 64 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f  idated for any o
6dd0: 74 68 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20  ther reason..** 
6de0: 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65  Cursors can move
6df0: 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68   when the row th
6e00: 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20  ey are pointing 
6e10: 61 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75  at is deleted ou
6e20: 74 0a 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20  t.** from under 
6e30: 74 68 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  them, for exampl
6e40: 65 2e 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74  e.  Cursor might
6e50: 20 61 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20   also move if a 
6e60: 62 74 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61  btree.** is reba
6e70: 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61  lanced..**.** Ca
6e80: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
6e90: 6e 65 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63  ne with a NULL c
6ea0: 75 72 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65  ursor pointer re
6eb0: 74 75 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a  turns false..**.
6ec0: 2a 2a 20 55 73 65 20 74 68 65 20 73 65 70 61 72  ** Use the separ
6ed0: 61 74 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  ate sqlite3Btree
6ee0: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20  CursorRestore() 
6ef0: 72 6f 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f  routine to resto
6f00: 72 65 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62  re a cursor.** b
6f10: 61 63 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20  ack to where it 
6f20: 6f 75 67 68 74 20 74 6f 20 62 65 20 69 66 20 74  ought to be if t
6f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6f40: 72 6e 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74  rns true..*/.int
6f50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
6f60: 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75  sorHasMoved(BtCu
6f70: 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
6f80: 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61  eturn pCur->eSta
6f90: 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
6fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6fb0: 72 6f 75 74 69 6e 65 20 72 65 73 74 6f 72 65 73  routine restores
6fc0: 20 61 20 63 75 72 73 6f 72 20 62 61 63 6b 20 74   a cursor back t
6fd0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 70  o its original p
6fe0: 6f 73 69 74 69 6f 6e 20 61 66 74 65 72 20 69 74  osition after it
6ff0: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 76  .** has been mov
7000: 65 64 20 62 79 20 73 6f 6d 65 20 6f 75 74 73 69  ed by some outsi
7010: 64 65 20 61 63 74 69 76 69 74 79 20 28 73 75 63  de activity (suc
7020: 68 20 61 73 20 61 20 62 74 72 65 65 20 72 65 62  h as a btree reb
7030: 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a 20 61 20 72  alance or.** a r
7040: 6f 77 20 68 61 76 69 6e 67 20 62 65 65 6e 20 64  ow having been d
7050: 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
7060: 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
7070: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  ).  .**.** On su
7080: 63 63 65 73 73 2c 20 74 68 65 20 2a 70 44 69 66  ccess, the *pDif
7090: 66 65 72 65 6e 74 52 6f 77 20 70 61 72 61 6d 65  ferentRow parame
70a0: 74 65 72 20 69 73 20 66 61 6c 73 65 20 69 66 20  ter is false if 
70b0: 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  the cursor is le
70c0: 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 61  ft.** pointing a
70d0: 74 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61  t exactly the sa
70e0: 6d 65 20 72 6f 77 2e 20 20 2a 70 44 69 66 66 65  me row.  *pDiffe
70f0: 72 6e 74 52 6f 77 20 69 73 20 74 68 65 20 72 6f  rntRow is the ro
7100: 77 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  w the cursor.** 
7110: 77 61 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  was pointing to 
7120: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64  has been deleted
7130: 2c 20 66 6f 72 63 69 6e 67 20 74 68 65 20 63 75  , forcing the cu
7140: 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
7150: 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61 72 62 79 20   some.** nearby 
7160: 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  row..**.** This 
7170: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
7180: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 6f  nly be called fo
7190: 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20  r a cursor that 
71a0: 6a 75 73 74 20 72 65 74 75 72 6e 65 64 0a 2a 2a  just returned.**
71b0: 20 54 52 55 45 20 66 72 6f 6d 20 73 71 6c 69 74   TRUE from sqlit
71c0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
71d0: 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20  Moved()..*/.int 
71e0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
71f0: 6f 72 52 65 73 74 6f 72 65 28 42 74 43 75 72 73  orRestore(BtCurs
7200: 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
7210: 44 69 66 66 65 72 65 6e 74 52 6f 77 29 7b 0a 20  DifferentRow){. 
7220: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
7230: 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20  rt( pCur!=0 );. 
7240: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
7250: 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
7260: 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  LID );.  rc = re
7270: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
7280: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
7290: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 44 69 66   rc ){.    *pDif
72a0: 66 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20  ferentRow = 1;. 
72b0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
72c0: 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
72d0: 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
72e0: 49 44 20 29 7b 0a 20 20 20 20 2a 70 44 69 66 66  ID ){.    *pDiff
72f0: 65 72 65 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20  erentRow = 1;.  
7300: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7310: 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
7320: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 44 69  t==0 );.    *pDi
7330: 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 30 3b 0a  fferentRow = 0;.
7340: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7350: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  ITE_OK;.}..#ifde
7360: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
7370: 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a  CURSOR_HINTS./*.
7380: 2a 2a 20 50 72 6f 76 69 64 65 20 68 69 6e 74 73  ** Provide hints
7390: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 20   to the cursor. 
73a0: 20 54 68 65 20 70 61 72 74 69 63 75 6c 61 72 20   The particular 
73b0: 68 69 6e 74 20 67 69 76 65 6e 20 28 61 6e 64 20  hint given (and 
73c0: 74 68 65 20 74 79 70 65 0a 2a 2a 20 61 6e 64 20  the type.** and 
73d0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 76 61  number of the va
73e0: 72 61 72 67 73 20 70 61 72 61 6d 65 74 65 72 73  rargs parameters
73f0: 29 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  ) is determined 
7400: 62 79 20 74 68 65 20 65 48 69 6e 74 54 79 70 65  by the eHintType
7410: 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2e 20 20  .** parameter.  
7420: 53 65 65 20 74 68 65 20 64 65 66 69 6e 69 74 69  See the definiti
7430: 6f 6e 73 20 6f 66 20 74 68 65 20 42 54 52 45 45  ons of the BTREE
7440: 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f 73 20 66  _HINT_* macros f
7450: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76  or details..*/.v
7460: 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
7470: 43 75 72 73 6f 72 48 69 6e 74 28 42 74 43 75 72  CursorHint(BtCur
7480: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 65  sor *pCur, int e
7490: 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a  HintType, ...){.
74a0: 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c 79 20 62    /* Used only b
74b0: 79 20 73 79 73 74 65 6d 20 74 68 61 74 20 73 75  y system that su
74c0: 62 73 74 69 74 75 74 65 20 74 68 65 69 72 20 6f  bstitute their o
74d0: 77 6e 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e  wn storage engin
74e0: 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  e */.}.#endif../
74f0: 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 66 6c 61  *.** Provide fla
7500: 67 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  g hints to the c
7510: 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ursor..*/.void s
7520: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7530: 72 48 69 6e 74 46 6c 61 67 73 28 42 74 43 75 72  rHintFlags(BtCur
7540: 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e 73 69 67  sor *pCur, unsig
7550: 6e 65 64 20 78 29 7b 0a 20 20 61 73 73 65 72 74  ned x){.  assert
7560: 28 20 78 3d 3d 42 54 52 45 45 5f 53 45 45 4b 5f  ( x==BTREE_SEEK_
7570: 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45 45 5f 42  EQ || x==BTREE_B
7580: 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d 3d 30 20  ULKLOAD || x==0 
7590: 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69 6e 74 73  );.  pCur->hints
75a0: 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65   = x;.}...#ifnde
75b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
75c0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47  TOVACUUM./*.** G
75d0: 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62  iven a page numb
75e0: 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20  er of a regular 
75f0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72  database page, r
7600: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a  eturn the page.*
7610: 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
7620: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
7630: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
7640: 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
7650: 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20  e.** input page 
7660: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
7670: 74 75 72 6e 20 30 20 28 6e 6f 74 20 61 20 76 61  turn 0 (not a va
7680: 6c 69 64 20 70 61 67 65 29 20 66 6f 72 20 70 67  lid page) for pg
7690: 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74 68 65 72  no==1 since ther
76a0: 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74  e is.** no point
76b0: 65 72 20 6d 61 70 20 61 73 73 6f 63 69 61 74 65  er map associate
76c0: 64 20 77 69 74 68 20 70 61 67 65 20 31 2e 20 20  d with page 1.  
76d0: 54 68 65 20 69 6e 74 65 67 72 69 74 79 5f 63 68  The integrity_ch
76e0: 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20 72 65 71  eck logic.** req
76f0: 75 69 72 65 73 20 74 68 61 74 20 70 74 72 6d 61  uires that ptrma
7700: 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e  pPageno(*,1)!=1.
7710: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
7720: 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53  ptrmapPageno(BtS
7730: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7740: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50   pgno){.  int nP
7750: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
7760: 20 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20    Pgno iPtrMap, 
7770: 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ret;.  assert( s
7780: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7790: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
77a0: 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32 20 29 20  .  if( pgno<2 ) 
77b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 50 61 67  return 0;.  nPag
77c0: 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28  esPerMapPage = (
77d0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
77e0: 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20  5)+1;.  iPtrMap 
77f0: 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65  = (pgno-2)/nPage
7800: 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72  sPerMapPage;.  r
7810: 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50  et = (iPtrMap*nP
7820: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29 20  agesPerMapPage) 
7830: 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d  + 2; .  if( ret=
7840: 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
7850: 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  GE(pBt) ){.    r
7860: 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  et++;.  }.  retu
7870: 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn ret;.}../*.**
7880: 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   Write an entry 
7890: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
78a0: 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73   map..**.** This
78b0: 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73   routine updates
78c0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
78d0: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
78e0: 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20  number 'key'.** 
78f0: 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73 20  so that it maps 
7900: 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27 20  to type 'eType' 
7910: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
7920: 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a  number 'pgno'..*
7930: 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20 69 73 20  *.** If *pRC is 
7940: 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65  initially non-ze
7950: 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f  ro (non-SQLITE_O
7960: 4b 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  K) then this rou
7970: 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d  tine is.** a no-
7980: 6f 70 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  op.  If an error
7990: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 61 70 70   occurs, the app
79a0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
79b0: 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ode is written.*
79c0: 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a  * into *pRC..*/.
79d0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d  static void ptrm
79e0: 61 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a  apPut(BtShared *
79f0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7a00: 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61  8 eType, Pgno pa
7a10: 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52 43 29 7b  rent, int *pRC){
7a20: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
7a30: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
7a40: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
7a50: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
7a60: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
7a70: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
7a80: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
7a90: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
7aa0: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
7ab0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
7ac0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
7ad0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
7ae0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
7af0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  rc;           /*
7b00: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
7b10: 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
7b20: 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20  /..  if( *pRC ) 
7b30: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
7b40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
7b50: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
7b60: 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61  ) );.  /* The ma
7b70: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67  ster-journal pag
7b80: 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65  e number must ne
7b90: 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61  ver be used as a
7ba0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7bb0: 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  e */.  assert( 0
7bc0: 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ==PTRMAP_ISPAGE(
7bd0: 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  pBt, PENDING_BYT
7be0: 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a  E_PAGE(pBt)) );.
7bf0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
7c00: 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
7c10: 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20  if( key==0 ){.  
7c20: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
7c30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
7c40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7c50: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
7c60: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
7c70: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
7c80: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
7c90: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
7ca0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
7cb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
7cc0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
7cd0: 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
7ce0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
7cf0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
7d00: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
7d10: 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29 7b   if( offset<0 ){
7d20: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
7d30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
7d40: 0a 20 20 20 20 67 6f 74 6f 20 70 74 72 6d 61 70  .    goto ptrmap
7d50: 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 61 73 73  _exit;.  }.  ass
7d60: 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28  ert( offset <= (
7d70: 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  int)pBt->usableS
7d80: 69 7a 65 2d 35 20 29 3b 0a 20 20 70 50 74 72 6d  ize-5 );.  pPtrm
7d90: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
7da0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
7db0: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
7dc0: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
7dd0: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
7de0: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
7df0: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
7e00: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
7e10: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
7e20: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
7e30: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
7e40: 29 3b 0a 20 20 20 20 2a 70 52 43 3d 20 72 63 20  );.    *pRC= rc 
7e50: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
7e60: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
7e70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7e80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
7e90: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
7ea0: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
7eb0: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
7ec0: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
7ed0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
7ee0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
7ef0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
7f00: 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  bPage);.}../*.**
7f10: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
7f20: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
7f30: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
7f40: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
7f50: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
7f60: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
7f70: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
7f80: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
7f90: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7fa0: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
7fb0: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
7fc0: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
7fd0: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
7fe0: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
7ff0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
8000: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
8010: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8020: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
8030: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
8040: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
8050: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
8060: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
8070: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
8080: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
8090: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
80a0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
80b0: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
80c0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
80d0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
80e0: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
80f0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8100: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
8110: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
8120: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
8130: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
8140: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8150: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
8160: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
8170: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
8180: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
8190: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
81a0: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
81b0: 61 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29  ap, &pDbPage, 0)
81c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
81d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
81e0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
81f0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
8200: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
8210: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
8220: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
8230: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
8240: 20 20 69 66 28 20 6f 66 66 73 65 74 3c 30 20 29    if( offset<0 )
8250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
8260: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
8270: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
8280: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8290: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
82a0: 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70  offset <= (int)p
82b0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35  Bt->usableSize-5
82c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
82d0: 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a 70 45  Type!=0 );.  *pE
82e0: 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70 5b 6f  Type = pPtrmap[o
82f0: 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20 70 50  ffset];.  if( pP
8300: 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d 20 67  gno ) *pPgno = g
8310: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
8320: 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a 20 20  [offset+1]);..  
8330: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8340: 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  f(pDbPage);.  if
8350: 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c 20 2a  ( *pEType<1 || *
8360: 70 45 54 79 70 65 3e 35 20 29 20 72 65 74 75 72  pEType>5 ) retur
8370: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
8380: 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  _BKPT;.  return 
8390: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
83a0: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
83b0: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
83c0: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
83d0: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
83e0: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
83f0: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
8400: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
8410: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
8420: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
8430: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
8440: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8450: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8460: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8470: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8480: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8490: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
84a0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
84b0: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
84c0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
84d0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
84e0: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
84f0: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8500: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8510: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8520: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8530: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8540: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8550: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8560: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8580: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8590: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
85a0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
85b0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
85c0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
85d0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
85e0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
85f0: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8600: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8610: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
8620: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
8630: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
8640: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
8650: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8660: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8670: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8680: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
8690: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
86a0: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
86b0: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
86c0: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
86d0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
86e0: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
86f0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
8700: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
8710: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
8720: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
8730: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
8740: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
8750: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
8760: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
8770: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8780: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
8790: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
87a0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
87b0: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
87c0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
87d0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
87e0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
87f0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8800: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8810: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8820: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8830: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8840: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8850: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8860: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
8870: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
8880: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
8890: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
88a0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
88b0: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
88c0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
88d0: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
88e0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
88f0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
8900: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
8910: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
8920: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
8930: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
8940: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
8950: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
8960: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
8970: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
8980: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
8990: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
89a0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
89b0: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
89c0: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
89d0: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
89e0: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
89f0: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
8a00: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
8a10: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
8a20: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
8a30: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
8a40: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
8a50: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
8a60: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
8a70: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
8a80: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
8a90: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
8aa0: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
8ab0: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
8ac0: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
8ad0: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
8ae0: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
8af0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
8b00: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
8b10: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
8b20: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
8b30: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
8b40: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
8b50: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
8b60: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
8b70: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
8b80: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
8b90: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
8ba0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
8bb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
8bc0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
8bd0: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
8be0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
8bf0: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
8c00: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
8c10: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
8c20: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
8c30: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
8c40: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
8c50: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
8c60: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
8c70: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
8c80: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
8c90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
8ca0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
8cb0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
8cc0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
8cd0: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8ce0: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
8cf0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
8d00: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
8d10: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8d20: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
8d30: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
8d40: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
8d50: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
8d60: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
8d70: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
8d80: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
8d90: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
8da0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
8db0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
8dc0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
8dd0: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
8de0: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
8df0: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
8e00: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
8e10: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
8e20: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
8e30: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
8e40: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
8e50: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8e60: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
8e70: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
8e80: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
8e90: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8ea0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8eb0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8ec0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8ed0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8ee0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8ef0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8f00: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8f10: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8f20: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8f30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8f40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8f50: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8f60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8f70: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
8f80: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8f90: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
8fa0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8fb0: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
8fc0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
8fd0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
8fe0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
8ff0: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9000: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9010: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9020: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9030: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
9040: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
9050: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
9060: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
9070: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9080: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
9090: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
90a0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
90b0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
90c0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
90d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
90e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
90f0: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9100: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9110: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9120: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9130: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9150: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9160: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9170: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9180: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9190: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
91a0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
91b0: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
91c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
91d0: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
91e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
91f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9200: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9210: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9220: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9230: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9240: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9250: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9270: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9280: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
9290: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
92a0: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
92b0: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
92c0: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
92d0: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
92e0: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
92f0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9300: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9310: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9320: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9330: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9340: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9350: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9360: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9370: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9380: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9390: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
93a0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
93b0: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
93c0: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
93d0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
93e0: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
93f0: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9400: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9410: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9420: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9430: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9440: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9450: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9460: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9470: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9480: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9490: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
94a0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
94b0: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
94c0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
94d0: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
94e0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
94f0: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9500: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9510: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9520: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9530: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9540: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9550: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9560: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9570: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9580: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9590: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
95a0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
95b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
95c0: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
95d0: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
95e0: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
95f0: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9600: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9610: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9620: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9630: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9640: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9650: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9660: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9670: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9680: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9690: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
96a0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
96b0: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
96c0: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
96d0: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
96e0: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
96f0: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9700: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9710: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9720: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9730: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9740: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9750: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9760: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9770: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9780: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9790: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
97a0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
97b0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
97c0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
97d0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
97e0: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
97f0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9800: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
9810: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9820: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9830: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9840: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9850: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9860: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9870: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
9880: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
9890: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
98a0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
98b0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
98c0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
98d0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
98e0: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
98f0: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
9900: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
9910: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9920: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
9930: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
9940: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
9950: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9960: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9970: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9980: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
9990: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
99a0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
99b0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
99c0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
99d0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
99e0: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
99f0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9a00: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9a10: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9a20: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9a30: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9a40: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9a50: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
9a60: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9a70: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9a80: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
9a90: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
9aa0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
9ab0: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
9ac0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
9ad0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
9ae0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
9af0: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9b00: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
9b10: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9b20: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
9b30: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9b40: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9b50: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9b60: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9b70: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
9b80: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
9b90: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
9ba0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
9bb0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
9bc0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
9bd0: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
9be0: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
9bf0: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
9c00: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
9c10: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
9c20: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9c30: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
9c40: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9c50: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9c60: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9c70: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9c80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
9c90: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
9ca0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
9cb0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
9cc0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
9cd0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
9ce0: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
9cf0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
9d00: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
9d10: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
9d20: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9d40: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
9d50: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
9d60: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
9d70: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
9d80: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
9d90: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
9da0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
9db0: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
9dc0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
9dd0: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
9de0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
9df0: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
9e00: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
9e10: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
9e20: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
9e30: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
9e40: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
9e50: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
9e60: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
9e70: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
9e80: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
9e90: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
9ea0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
9eb0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
9ec0: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
9ed0: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
9ee0: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
9ef0: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
9f00: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
9f10: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
9f20: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
9f30: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
9f40: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
9f50: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
9f60: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
9f80: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
9f90: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
9fa0: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
9fb0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
9fc0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
9fd0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
9fe0: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
9ff0: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a000: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
a010: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
a020: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
a030: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a060: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a070: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a0a0: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
a0b0: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
a0c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
a0d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a0e0: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
a0f0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
a100: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
a110: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
a120: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
a130: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
a140: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
a150: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
a160: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
a170: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
a180: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
a190: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
a1a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
a1b0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
a1c0: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
a1d0: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
a1e0: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
a1f0: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
a200: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
a210: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
a220: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
a230: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
a240: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
a250: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
a260: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
a270: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
a280: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
a290: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
a2a0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
a2b0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
a2c0: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
a2d0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
a2e0: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
a2f0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
a300: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
a310: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
a320: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
a330: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
a340: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
a350: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
a360: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
a370: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
a380: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
a390: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
a3a0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a3b0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
a3c0: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
a3d0: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
a3e0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
a3f0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a400: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
a410: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
a420: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
a430: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a440: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a450: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
a460: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
a470: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
a480: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
a490: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a4a0: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
a4b0: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
a4c0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
a4d0: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
a4e0: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
a4f0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
a500: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
a510: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
a520: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
a530: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a540: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a550: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
a560: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a570: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
a580: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
a590: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
a5a0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
a5b0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
a5c0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
a5d0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a5e0: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
a5f0: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
a600: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
a610: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
a620: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
a630: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
a640: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
a650: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
a660: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a670: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a680: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
a690: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a6a0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a6b0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a6c0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
a6d0: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
a6e0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a6f0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
a700: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
a710: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
a720: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
a730: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
a740: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
a750: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
a760: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
a770: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
a780: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
a790: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
a7a0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
a7b0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
a7c0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
a7d0: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
a7e0: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
a7f0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
a800: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
a810: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
a820: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
a830: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
a840: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
a850: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
a860: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
a870: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
a880: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a890: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
a8a0: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
a8b0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
a8c0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
a8d0: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
a8e0: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
a8f0: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
a900: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
a910: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
a920: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
a930: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
a940: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
a950: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
a960: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
a970: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
a980: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
a990: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
a9a0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
a9b0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
a9c0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
a9d0: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
a9e0: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
a9f0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
aa00: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
aa10: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
aa20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
aa30: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
aa40: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
aa50: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
aa60: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
aa70: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
aa80: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
aa90: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
aaa0: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
aab0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
aac0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
aad0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
aae0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
aaf0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
ab00: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
ab10: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
ab20: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
ab30: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
ab40: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
ab50: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
ab60: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
ab70: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
ab80: 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66   info.nLocal<inf
ab90: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
aba0: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
abb0: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
abc0: 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20  fo.nSize-4]);.  
abd0: 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67    ptrmapPut(pPag
abe0: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
abf0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
ac00: 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43  pPage->pgno, pRC
ac10: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
ac20: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
ac30: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
ac40: 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72  n.  All Cells ar
ac50: 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a  e moved to the.*
ac60: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  * end of the pag
ac70: 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20 73  e and all free s
ac80: 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74 65  pace is collecte
ac90: 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69  d into one.** bi
aca0: 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20 6f  g FreeBlk that o
acb0: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
acc0: 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64 20   the header and 
acd0: 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  cell.** pointer 
ace0: 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63 65  array and the ce
acf0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
ad00: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
ad10: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
ad20: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
ad30: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
ad40: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
ad50: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
ad60: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
ad70: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
ad80: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
ad90: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
ada0: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
adb0: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
adc0: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
add0: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
ade0: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
adf0: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
ae00: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
ae10: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
ae20: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
ae30: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
ae40: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ae50: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ae60: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
ae70: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
ae80: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
ae90: 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63  ss of the i-th c
aea0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ell */.  int hdr
aeb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aec0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
aed0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
aee0: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
af10: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
af20: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
af30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
af40: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
af50: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
af60: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
af70: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af80: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
af90: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
afa0: 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20  int cbrk;       
afb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
afc0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
afd0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
afe0: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b000: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
b010: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
b020: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
b030: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
b040: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
b050: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b060: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
b070: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
b080: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
b090: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
b0a0: 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  src;        /* S
b0b0: 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74  ource of content
b0c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46   */.  int iCellF
b0d0: 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
b0e0: 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61   /* First allowa
b0f0: 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  ble cell index *
b100: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
b110: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
b120: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
b130: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a  cell index */...
b140: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b150: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
b160: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
b170: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
b180: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
b190: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
b1a0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
b1b0: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
b1c0: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
b1d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
b1e0: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
b1f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b200: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
b210: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
b220: 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72    temp = 0;.  sr
b230: 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61 67 65  c = data = pPage
b240: 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
b250: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
b260: 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20  t;.  cellOffset 
b270: 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
b280: 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  set;.  nCell = p
b290: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
b2a0: 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65  ssert( nCell==ge
b2b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
b2c0: 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65  +3]) );.  usable
b2d0: 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42  Size = pPage->pB
b2e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
b2f0: 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69   cbrk = usableSi
b300: 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ze;.  iCellFirst
b310: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
b320: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c  2*nCell;.  iCell
b330: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
b340: 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69 3d 30  e - 4;.  for(i=0
b350: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
b360: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
b370: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
b380: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
b390: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
b3a0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
b3b0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
b3c0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
b3d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
b3e0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b3f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
b400: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
b410: 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e 64 69    /* These condi
b420: 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72 65 61  tions have alrea
b430: 64 79 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  dy been verified
b440: 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50 61 67   in btreeInitPag
b450: 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20 50 52  e().    ** if PR
b460: 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63  AGMA cell_size_c
b470: 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a  heck=ON..    */.
b480: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
b490: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
b4a0: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 72  lLast ){.      r
b4b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b4c0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
b4d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
b4e0: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
b4f0: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
b500: 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65      size = pPage
b510: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
b520: 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20  e, &src[pc]);.  
b530: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
b540: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
b550: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
b560: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
b570: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
b580: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b590: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
b5a0: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
b5b0: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
b5c0: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
b5d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
b5e0: 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c  cbrk+size==usabl
b5f0: 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73  eSize );.    tes
b600: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
b610: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
b620: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
b630: 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69 66 28  , cbrk);.    if(
b640: 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20   temp==0 ){.    
b650: 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20 20 69    int x;.      i
b660: 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20 63 6f  f( cbrk==pc ) co
b670: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 74 65  ntinue;.      te
b680: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
b690: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
b6a0: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
b6b0: 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62 79        x = get2by
b6c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
b6d0: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
b6e0: 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61 5b 78  temp[x], &data[x
b6f0: 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29 20 2d  ], (cbrk+size) -
b700: 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63 20 3d   x);.      src =
b710: 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20   temp;.    }.   
b720: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 62   memcpy(&data[cb
b730: 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c 20 73  rk], &src[pc], s
b740: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ize);.  }.  asse
b750: 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46  rt( cbrk>=iCellF
b760: 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32 62 79  irst );.  put2by
b770: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
b780: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
b790: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
b7a0: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
b7b0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
b7c0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
b7d0: 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20  iCellFirst], 0, 
b7e0: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29  cbrk-iCellFirst)
b7f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b800: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
b810: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
b820: 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62 72  ge) );.  if( cbr
b830: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50  k-iCellFirst!=pP
b840: 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
b850: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b860: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b870: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
b880: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
b890: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c  earch the free-l
b8a0: 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20  ist on page pPg 
b8b0: 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f  for space to sto
b8c0: 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20  re a cell nByte 
b8d0: 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65  bytes in.** size
b8e0: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
b8f0: 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20  found, return a 
b900: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
b910: 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20  pace and remove 
b920: 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  it.** from the f
b930: 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ree-list..**.** 
b940: 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73  If no suitable s
b950: 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e  pace can be foun
b960: 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  d on the free-li
b970: 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  st, return NULL.
b980: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
b990: 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20  tion may detect 
b9a0: 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69  corruption withi
b9b0: 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75  n pPg.  If corru
b9c0: 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65  ption is.** dete
b9d0: 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69  cted then *pRc i
b9e0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
b9f0: 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c  CORRUPT and NULL
ba00: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
ba10: 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65  .** Slots on the
ba20: 20 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20   free list that 
ba30: 61 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e  are between 1 an
ba40: 64 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72  d 3 bytes larger
ba50: 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77   than nByte.** w
ba60: 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69  ill be ignored i
ba70: 66 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74  f adding the ext
ba80: 72 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20  ra space to the 
ba90: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f  fragmentation co
baa0: 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68  unt.** causes th
bab0: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
bac0: 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20  count to exceed 
bad0: 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38  60..*/.static u8
bae0: 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d   *pageFindSlot(M
baf0: 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74  emPage *pPg, int
bb00: 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63   nByte, int *pRc
bb10: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
bb20: 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
bb30: 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  set;.  u8 * cons
bb40: 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
bb50: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64  Data;.  int iAdd
bb60: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
bb70: 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
bb80: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b  (&aData[iAddr]);
bb90: 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20  .  int x;.  int 
bba0: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
bbb0: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
bbc0: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63  e;..  assert( pc
bbd0: 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  >0 );.  do{.    
bbe0: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
bbf0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
bc00: 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f  the free slot */
bc10: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
bc20: 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33 39 31  -OF: R-06866-391
bc30: 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20 61 72  25 Freeblocks ar
bc40: 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65 63 74  e always connect
bc50: 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66 0a 20  ed in order of. 
bc60: 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69 6e 67     ** increasing
bc70: 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20 20 20   offset. */.    
bc80: 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a  if( pc>usableSiz
bc90: 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64 72 2b  e-4 || pc<iAddr+
bca0: 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  4 ){.      *pRc 
bcb0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
bcc0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
bcd0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
bce0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
bcf0: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
bd00: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
bd10: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
bd20: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
bd30: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
bd40: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
bd50: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
bd60: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
bd70: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
bd80: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
bd90: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
bda0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
bdb0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
bdc0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
bdd0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
bde0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
bdf0: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
be00: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
be10: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  3 );.      if( p
be20: 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f 66 66  c < pPg->cellOff
be30: 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c  set+2*pPg->nCell
be40: 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20 75 73   || size+pc > us
be50: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
be60: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
be70: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
be80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
be90: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
bea0: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
beb0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
bec0: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
bed0: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
bee0: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
bef0: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
bf00: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
bf10: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
bf20: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
bf30: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
bf40: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
bf50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
bf60: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
bf70: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
bf80: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
bf90: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
bfa0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
bfb0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
bfc0: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
bfd0: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
bfe0: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
bff0: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
c000: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
c010: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
c020: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c030: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
c040: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
c050: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
c060: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
c070: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
c080: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
c090: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
c0a0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
c0b0: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
c0c0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
c0d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c0e0: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
c0f0: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
c100: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
c110: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c120: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 7d  &aData[pc]);.  }
c130: 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a 20 20  while( pc );..  
c140: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c150: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
c160: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
c170: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
c180: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
c190: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
c1a0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
c1b0: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
c1c0: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
c1d0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
c1e0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
c1f0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
c200: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
c210: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
c220: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
c230: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
c240: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
c250: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
c260: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
c270: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
c280: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
c290: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
c2a0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
c2b0: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
c2c0: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
c2d0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
c2e0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
c2f0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
c300: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
c310: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
c320: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
c330: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
c340: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
c350: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
c360: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
c370: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
c380: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
c390: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
c3a0: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
c3b0: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
c3c0: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
c3d0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
c3e0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
c3f0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
c400: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
c410: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
c420: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
c430: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
c440: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
c450: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
c460: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
c470: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
c480: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
c490: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
c4a0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
c4b0: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c4d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
c4e0: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
c4f0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
c500: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c510: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
c520: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
c530: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
c540: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
c550: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
c560: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
c570: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
c580: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
c590: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
c5a0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
c5b0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
c5c0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
c5d0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
c5e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c5f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
c600: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
c610: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
c620: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
c630: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
c640: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
c650: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
c660: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
c670: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
c680: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
c690: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
c6a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
c6b0: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
c6c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
c6d0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
c6e0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
c6f0: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
c700: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
c710: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
c720: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
c730: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
c740: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
c750: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
c760: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
c770: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
c780: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
c790: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
c7a0: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
c7b0: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
c7c0: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
c7d0: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
c7e0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
c7f0: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
c800: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
c810: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
c820: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
c830: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
c840: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
c850: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
c860: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
c870: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
c880: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
c890: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
c8a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c8b0: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
c8c0: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
c8d0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
c8e0: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
c8f0: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
c900: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
c910: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
c920: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
c930: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c940: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
c950: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
c960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c970: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c980: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
c990: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
c9a0: 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20  there is enough 
c9b0: 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61  space between ga
c9c0: 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e  p and top for on
c9d0: 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e  e more cell poin
c9e0: 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65  ter.  ** array e
c9f0: 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64  ntry offset, and
ca00: 20 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   if the freelist
ca10: 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74   is not empty, t
ca20: 68 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20  hen search the. 
ca30: 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f   ** freelist loo
ca40: 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20  king for a free 
ca50: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
ca60: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72  to satisfy the r
ca70: 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74  equest..  */.  t
ca80: 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d  estcase( gap+2==
ca90: 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73  top );.  testcas
caa0: 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b  e( gap+1==top );
cab0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
cac0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28  ==top );.  if( (
cad0: 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64  data[hdr+2] || d
cae0: 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67  ata[hdr+1]) && g
caf0: 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20  ap+2<=top ){.   
cb00: 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61   u8 *pSpace = pa
cb10: 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65  geFindSlot(pPage
cb20: 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20  , nByte, &rc);. 
cb30: 20 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b     if( pSpace ){
cb40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cb50: 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28  Space>=data && (
cb60: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36  pSpace - data)<6
cb70: 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70  5536 );.      *p
cb80: 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61  Idx = (int)(pSpa
cb90: 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20  ce - data);.    
cba0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cbb0: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
cbc0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
cbd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
cbe0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71   }..  /* The req
cbf0: 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62  uest could not b
cc00: 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e  e fulfilled usin
cc10: 67 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f  g a freelist slo
cc20: 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74  t.  Check.  ** t
cc30: 6f 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d  o see if defragm
cc40: 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65  entation is nece
cc50: 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65  ssary..  */.  te
cc60: 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42  stcase( gap+2+nB
cc70: 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66  yte==top );.  if
cc80: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f  ( gap+2+nByte>to
cc90: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
cca0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20   pPage->nCell>0 
ccb0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
ccc0: 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67  .    rc = defrag
ccd0: 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
cce0: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
ccf0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70  turn rc;.    top
cd00: 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65   = get2byteNotZe
cd10: 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  ro(&data[hdr+5])
cd20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61  ;.    assert( ga
cd30: 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b 0a  p+nByte<=top );.
cd40: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63    }...  /* Alloc
cd50: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
cd60: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
cd70: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
cd80: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
cd90: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
cda0: 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20 62  ent area.  The b
cdb0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 63  treeInitPage() c
cdc0: 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64 79 0a  all has already.
cdd0: 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64 20 74    ** validated t
cde0: 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 47 69  he freelist.  Gi
cdf0: 76 65 6e 20 74 68 61 74 20 74 68 65 20 66 72 65  ven that the fre
ce00: 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64 2c 20  elist is valid, 
ce10: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  there.  ** is no
ce20: 20 77 61 79 20 74 68 61 74 20 74 68 65 20 61 6c   way that the al
ce30: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65 78 74  location can ext
ce40: 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e 64 20  end off the end 
ce50: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  of the page..  *
ce60: 2a 20 54 68 65 20 61 73 73 65 72 74 28 29 20 62  * The assert() b
ce70: 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
ce80: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
ce90: 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  nce..  */.  top 
cea0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32  -= nByte;.  put2
ceb0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
cec0: 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73 65 72  ], top);.  asser
ced0: 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c 3d 20  t( top+nByte <= 
cee0: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
cef0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
cf00: 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a 20 20   *pIdx = top;.  
cf10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cf20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
cf30: 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74  n a section of t
cf40: 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  he pPage->aData 
cf50: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
cf60: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
cf70: 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72  te of the new fr
cf80: 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67  ee block is pPag
cf90: 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72 74 5d  e->aData[iStart]
cfa0: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
cfb0: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
cfc0: 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a   iSize bytes..**
cfd0: 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66 72 65  .** Adjacent fre
cfe0: 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f 61 6c  eblocks are coal
cff0: 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  esced..**.** Not
d000: 65 20 74 68 61 74 20 65 76 65 6e 20 74 68 6f 75  e that even thou
d010: 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  gh the freeblock
d020: 20 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65   list was checke
d030: 64 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61  d by btreeInitPa
d040: 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20 72 6f  ge(),.** that ro
d050: 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74 20 64  utine will not d
d060: 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20 62 65  etect overlap be
d070: 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72 20 66  tween cells or f
d080: 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a  reeblocks.  Nor.
d090: 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74 65 63  ** does it detec
d0a0: 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  t cells or freeb
d0b0: 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63 72 6f  locks that encro
d0c0: 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72 65 73  uch into the res
d0d0: 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a 20 61  erved bytes.** a
d0e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
d0f0: 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20 61 64   page.  So do ad
d100: 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75 70 74  ditional corrupt
d110: 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73 69 64  ion checks insid
d120: 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  e this.** routin
d130: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  e and return SQL
d140: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
d150: 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72 65 20  ny problems are 
d160: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
d170: 20 69 6e 74 20 66 72 65 65 53 70 61 63 65 28 4d   int freeSpace(M
d180: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
d190: 31 36 20 69 53 74 61 72 74 2c 20 75 31 36 20 69  16 iStart, u16 i
d1a0: 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69 50 74  Size){.  u16 iPt
d1b0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d1d0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70 74 72  * Address of ptr
d1e0: 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62 6c 6f   to next freeblo
d1f0: 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46 72 65  ck */.  u16 iFre
d200: 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20 20 20  eBlk;           
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d220: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
d230: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
d240: 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20  /.  u8 hdr;     
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
d270: 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e 20 20  e header size.  
d280: 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20 75 38  0 or 100 */.  u8
d290: 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20 20 20   nFrag = 0;     
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69 6f 6e      /* Reduction
d2c0: 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74 69 6f   in fragmentatio
d2d0: 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72 69 67  n */.  u16 iOrig
d2e0: 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20 20 20  Size = iSize;   
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d300: 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f  Original value o
d310: 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75 33 32  f iSize */.  u32
d320: 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65 2d 3e   iLast = pPage->
d330: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
d340: 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 6f  4; /* Largest po
d350: 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f 63 6b  ssible freeblock
d360: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75 33 32   offset */.  u32
d370: 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20 2b   iEnd = iStart +
d380: 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   iSize;         
d390: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
d3a0: 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72 74   past the iStart
d3b0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73   buffer */.  uns
d3c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
d3d0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d3e0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65     /* Page conte
d3f0: 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
d400: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
d410: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d420: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
d430: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
d440: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
d450: 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
d460: 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64  Start>=pPage->hd
d470: 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65 2d  rOffset+6+pPage-
d480: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29 3b  >childPtrSize );
d490: 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
d4a0: 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d  PT_DB || iEnd <=
d4b0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
d4c0: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  bleSize );.  ass
d4d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d4e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
d4f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
d500: 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d 34  assert( iSize>=4
d510: 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d   );   /* Minimum
d520: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
d530: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
d540: 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a 0a 20  art<=iLast );.. 
d550: 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65   /* Overwrite de
d560: 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f  leted informatio
d570: 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65  n with zeros whe
d580: 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  n the secure_del
d590: 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  ete.  ** option 
d5a0: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
d5b0: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
d5c0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
d5d0: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
d5e0: 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
d5f0: 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69  [iStart], 0, iSi
d600: 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ze);.  }..  /* T
d610: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62  he list of freeb
d620: 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e  locks must be in
d630: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
d640: 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20 20 2a  .  Find the .  *
d650: 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69  * spot on the li
d660: 73 74 20 77 68 65 72 65 20 69 53 74 61 72 74 20  st where iStart 
d670: 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72 74  should be insert
d680: 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d  ed..  */.  hdr =
d690: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
d6a0: 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64 72 20  t;.  iPtr = hdr 
d6b0: 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74 61 5b  + 1;.  if( data[
d6c0: 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61  iPtr+1]==0 && da
d6d0: 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20  ta[iPtr]==0 ){. 
d6e0: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b     iFreeBlk = 0;
d6f0: 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20 66 6f    /* Shortcut fo
d700: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20  r the case when 
d710: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
d720: 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65  empty */.  }else
d730: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 69 46  {.    while( (iF
d740: 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74  reeBlk = get2byt
d750: 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29 29 3e  e(&data[iPtr]))>
d760: 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c 69 53  0 && iFreeBlk<iS
d770: 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66  tart ){.      if
d780: 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b  ( iFreeBlk<iPtr+
d790: 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  4 ) return SQLIT
d7a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
d7b0: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
d7c0: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
d7d0: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 69 4c   if( iFreeBlk>iL
d7e0: 61 73 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ast ) return SQL
d7f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d800: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  ;.    assert( iF
d810: 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69  reeBlk>iPtr || i
d820: 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20  FreeBlk==0 );.  
d830: 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20  .    /* At this 
d840: 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20  point:.    **   
d850: 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72   iFreeBlk:   Fir
d860: 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74  st freeblock aft
d870: 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65  er iStart, or ze
d880: 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a  ro if none.    *
d890: 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20  *    iPtr:      
d8a0: 20 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   The address of 
d8b0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72  a pointer to iFr
d8c0: 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20  eeBlk.    **.   
d8d0: 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
d8e0: 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f   if iFreeBlk sho
d8f0: 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64  uld be coalesced
d900: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
d910: 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a   iStart..    */.
d920: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
d930: 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65   && iEnd+3>=iFre
d940: 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46  eBlk ){.      nF
d950: 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d  rag = iFreeBlk -
d960: 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28   iEnd;.      if(
d970: 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29   iEnd>iFreeBlk )
d980: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d990: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d9a0: 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42     iEnd = iFreeB
d9b0: 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28 26 64  lk + get2byte(&d
d9c0: 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29  ata[iFreeBlk+2])
d9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
d9e0: 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
d9f0: 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65 74 75  sableSize ) retu
da00: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
da10: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 53  T_BKPT;.      iS
da20: 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74  ize = iEnd - iSt
da30: 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65  art;.      iFree
da40: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
da50: 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b  data[iFreeBlk]);
da60: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
da70: 20 49 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74   If iPtr is anot
da80: 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74  her freeblock (t
da90: 68 61 74 20 69 73 2c 20 69 66 20 69 50 74 72 20  hat is, if iPtr 
daa0: 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c  is not the freel
dab0: 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74  ist.    ** point
dac0: 65 72 20 69 6e 20 74 68 65 20 70 61 67 65 20 68  er in the page h
dad0: 65 61 64 65 72 29 20 74 68 65 6e 20 63 68 65 63  eader) then chec
dae0: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53 74 61  k to see if iSta
daf0: 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20  rt should be.   
db00: 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e   ** coalesced on
db10: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50  to the end of iP
db20: 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  tr..    */.    i
db30: 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b  f( iPtr>hdr+1 ){
db40: 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74 72 45  .      int iPtrE
db50: 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32  nd = iPtr + get2
db60: 62 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b  byte(&data[iPtr+
db70: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
db80: 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74  PtrEnd+3>=iStart
db90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
dba0: 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29  iPtrEnd>iStart )
dbb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
dbc0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
dbd0: 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69 53       nFrag += iS
dbe0: 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a  tart - iPtrEnd;.
dbf0: 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20          iSize = 
dc00: 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20 20  iEnd - iPtr;.   
dc10: 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 50       iStart = iP
dc20: 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  tr;.      }.    
dc30: 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67 3e  }.    if( nFrag>
dc40: 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72 65  data[hdr+7] ) re
dc50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
dc60: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 64 61  UPT_BKPT;.    da
dc70: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e 46 72  ta[hdr+7] -= nFr
dc80: 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 53  ag;.  }.  if( iS
dc90: 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65 28 26  tart==get2byte(&
dca0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 7b 0a  data[hdr+5]) ){.
dcb0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 66      /* The new f
dcc0: 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20 74  reeblock is at t
dcd0: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
dce0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
dcf0: 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f   area,.    ** so
dd00: 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68 65   just extend the
dd10: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
dd20: 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20 63  ea rather than c
dd30: 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20 20  reate another.  
dd40: 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65 6e    ** freelist en
dd50: 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  try */.    if( i
dd60: 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74  Ptr!=hdr+1 ) ret
dd70: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
dd80: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 75 74  PT_BKPT;.    put
dd90: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
dda0: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
ddb0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
ddc0: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
ddd0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
dde0: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
ddf0: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
de00: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
de10: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
de20: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
de30: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
de40: 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46  data[iStart], iF
de50: 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74  reeBlk);.    put
de60: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
de70: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
de80: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
de90: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
dea0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
deb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
dec0: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
ded0: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
dee0: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
def0: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
df00: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
df10: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
df20: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
df30: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
df40: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
df50: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
df60: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
df70: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
df80: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
df90: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
dfa0: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
dfb0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
dfc0: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
dfd0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
dfe0: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
dff0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e000: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
e010: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
e020: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e030: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
e040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
e050: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
e060: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
e070: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
e080: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
e090: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
e0a0: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
e0b0: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
e0c0: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
e0d0: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
e0e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e0f0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
e100: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
e110: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
e120: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
e130: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
e140: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
e150: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
e160: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
e170: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
e180: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
e190: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
e1a0: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
e1b0: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
e1c0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
e1d0: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
e1e0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
e1f0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
e200: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e210: 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35 20 41   R-03640-13415 A
e220: 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65 61 6e   value of 5 mean
e230: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
e240: 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20 2a 2a   interior.    **
e250: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
e260: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
e270: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
e280: 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20  |PTF_INTKEY)==5 
e290: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
e2a0: 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31 2d 36  CE-OF: R-20501-6
e2b0: 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f 66 20  1796 A value of 
e2c0: 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  13 means the pag
e2d0: 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20  e is a leaf.    
e2e0: 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  ** table b-tree 
e2f0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e300: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e310: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  TA|PTF_INTKEY|PT
e320: 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20  F_LEAF)==13 );. 
e330: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
e340: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50   = 1;.    if( pP
e350: 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
e360: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
e370: 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  Leaf = 1;.      
e380: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e390: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e3a0: 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65  llPtr;.    }else
e3b0: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69  {.      pPage->i
e3c0: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
e3d0: 20 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c       pPage->xCel
e3e0: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
e3f0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
e400: 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
e410: 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72  eCell = btreePar
e420: 73 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f  seCellPtrNoPaylo
e430: 61 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ad;.    }.    pP
e440: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
e450: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
e460: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
e470: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
e480: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
e490: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
e4a0: 44 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45  DATA ){.    /* E
e4b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37  VIDENCE-OF: R-27
e4c0: 32 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c 75  225-53936 A valu
e4d0: 65 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68 65  e of 2 means the
e4e0: 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65   page is an inte
e4f0: 72 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65  rior.    ** inde
e500: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
e510: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e520: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
e530: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
e540: 43 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31  CE-OF: R-16571-1
e550: 31 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20  1615 A value of 
e560: 31 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  10 means the pag
e570: 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20  e is a leaf.    
e580: 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  ** index b-tree 
e590: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e5a0: 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41  ert( (PTF_ZERODA
e5b0: 54 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30  TA|PTF_LEAF)==10
e5c0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
e5d0: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
e5e0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
e5f0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
e600: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
e610: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
e620: 6e 64 65 78 3b 0a 20 20 20 20 70 50 61 67 65 2d  ndex;.    pPage-
e630: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
e640: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70  >maxLocal;.    p
e650: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d  Page->minLocal =
e660: 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a   pBt->minLocal;.
e670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
e680: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
e690: 37 36 30 38 2d 35 36 34 36 39 20 41 6e 79 20 6f  7608-56469 Any o
e6a0: 74 68 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  ther value for t
e6b0: 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74  he b-tree page t
e6c0: 79 70 65 20 69 73 0a 20 20 20 20 2a 2a 20 61 6e  ype is.    ** an
e6d0: 20 65 72 72 6f 72 2e 20 2a 2f 0a 20 20 20 20 72   error. */.    r
e6e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
e6f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
e700: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
e710: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
e720: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
e730: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e740: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
e750: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
e760: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
e770: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
e780: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
e790: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e7a0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
e7b0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
e7c0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
e7d0: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
e7e0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
e7f0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
e800: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
e810: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
e820: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
e830: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
e840: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
e850: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
e860: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
e870: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
e880: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
e890: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
e8a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
e8b0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
e8c0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
e8d0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
e8e0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
e8f0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
e900: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
e910: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
e920: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
e930: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
e940: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
e950: 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50  o==sqlite3PagerP
e960: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
e970: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
e980: 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20  ssert( pPage == 
e990: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
e9a0: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
e9b0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
e9c0: 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d  ( pPage->aData =
e9d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
e9e0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
e9f0: 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20  Page) );..  if( 
ea00: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
ea10: 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20  {.    u16 pc;   
ea20: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
ea30: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
ea40: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
ea50: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20  >aData[] */.    
ea60: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
ea70: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
ea80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
ea90: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  e header */.    
eaa0: 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
eab0: 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70     /* Equal to p
eac0: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
ead0: 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
eae0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
eaf0: 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63  main btree struc
eb00: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ture */.    int 
eb10: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f  usableSize;    /
eb20: 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62  * Amount of usab
eb30: 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  le space on each
eb40: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36   page */.    u16
eb50: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
eb60: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
eb70: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
eb80: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
eb90: 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 46  er */.    int nF
eba0: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
ebb0: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
ebc0: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
ebd0: 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 6f  ge */.    int to
ebe0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  p;           /* 
ebf0: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
ec00: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ec10: 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  rea */.    int i
ec20: 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a  CellFirst;    /*
ec30: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
ec40: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
ec50: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 20  ck offset */.   
ec60: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
ec70: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
ec80: 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  ible cell or fre
ec90: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
eca0: 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67  ..    pBt = pPag
ecb0: 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72  e->pBt;..    hdr
ecc0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
ecd0: 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  set;.    data = 
ece0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
ecf0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
ed00: 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
ed10: 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
ed20: 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
ed30: 64 69 63 61 74 69 6e 67 0a 20 20 20 20 2a 2a 20  dicating.    ** 
ed40: 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
ed50: 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  type. */.    if(
ed60: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
ed70: 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29  ge, data[hdr]) )
ed80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
ed90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
eda0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
edb0: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
edc0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
edd0: 35 33 36 20 29 3b 0a 20 20 20 20 70 50 61 67 65  536 );.    pPage
ede0: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
edf0: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
ee00: 20 2d 20 31 29 3b 0a 20 20 20 20 70 50 61 67 65   - 1);.    pPage
ee10: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
ee20: 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
ee30: 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
ee40: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65  e;.    pPage->ce
ee50: 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f  llOffset = cellO
ee60: 66 66 73 65 74 20 3d 20 68 64 72 20 2b 20 38 20  ffset = hdr + 8 
ee70: 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
ee80: 72 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  rSize;.    pPage
ee90: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
eea0: 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
eeb0: 20 20 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c      pPage->aCell
eec0: 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c  Idx = &data[cell
eed0: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 50 61  Offset];.    pPa
eee0: 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
eef0: 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69  &data[pPage->chi
ef00: 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 20 20  ldPtrSize];.    
ef10: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
ef20: 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20 54 68  R-58015-48175 Th
ef30: 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
ef40: 65 72 20 61 74 20 6f 66 66 73 65 74 20 35 20 64  er at offset 5 d
ef50: 65 73 69 67 6e 61 74 65 73 0a 20 20 20 20 2a 2a  esignates.    **
ef60: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ef70: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ef80: 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
ef90: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
efa0: 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 69 6e 74  er is.    ** int
efb0: 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35 33  erpreted as 6553
efc0: 36 2e 20 2a 2f 0a 20 20 20 20 74 6f 70 20 3d 20  6. */.    top = 
efd0: 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28  get2byteNotZero(
efe0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
eff0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f000: 46 3a 20 52 2d 33 37 30 30 32 2d 33 32 37 37 34  F: R-37002-32774
f010: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
f020: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
f030: 33 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20  3 gives the.    
f040: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  ** number of cel
f050: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  ls on the page. 
f060: 2a 2f 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  */.    pPage->nC
f070: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
f080: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
f090: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
f0a0: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
f0b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
f0c0: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
f0d0: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
f0e0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
f0f0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
f100: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f110: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f120: 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
f130: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58  pPage->nCell==MX
f140: 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20  _CELL(pBt) );.  
f150: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f160: 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39 20  : R-24089-57979 
f170: 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61 69  If a page contai
f180: 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68 69  ns no cells (whi
f190: 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 20 20 2a  ch is only.    *
f1a0: 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61  * possible for a
f1b0: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
f1c0: 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61  table that conta
f1d0: 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65  ins no rows) the
f1e0: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 66 66  n the.    ** off
f1f0: 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
f200: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c  content area wil
f210: 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65  l equal the page
f220: 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a   size minus the.
f230: 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
f240: 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20  reserved space. 
f250: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
f260: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
f270: 20 74 6f 70 3d 3d 75 73 61 62 6c 65 53 69 7a 65   top==usableSize
f280: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
f290: 3b 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66  ;..    /* A malf
f2a0: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
f2b0: 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  age might cause 
f2c0: 75 73 20 74 6f 20 72 65 61 64 20 70 61 73 74 20  us to read past 
f2d0: 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20 6f  the end.    ** o
f2e0: 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73  f page when pars
f2f0: 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20  ing a cell.  .  
f300: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
f310: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
f320: 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20 65  of code checks e
f330: 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20 61  arly to see if a
f340: 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20 20   cell extends.  
f350: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
f360: 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e  d of a page boun
f370: 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20  dary and causes 
f380: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74  SQLITE_CORRUPT t
f390: 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65 74  o be .    ** ret
f3a0: 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
f3b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43 65  ..    */.    iCe
f3c0: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
f3d0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
f3e0: 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c 6c  nCell;.    iCell
f3f0: 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69 7a  Last = usableSiz
f400: 65 20 2d 20 34 3b 0a 20 20 20 20 69 66 28 20 70  e - 4;.    if( p
f410: 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
f420: 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
f430: 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  k ){.      int i
f440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
f450: 49 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63  Index into the c
f460: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
f470: 79 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  y */.      int s
f480: 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z;           /* 
f490: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
f4a0: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  /..      if( !pP
f4b0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
f4c0: 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
f4d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
f4e0: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
f4f0: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
f500: 79 74 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61  yteAligned(&data
f510: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
f520: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
f530: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
f540: 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 74  rst );.        t
f550: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
f560: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  llLast );.      
f570: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
f580: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
f590: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ast ){.         
f5a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f5b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
f5c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
f5d0: 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  z = pPage->xCell
f5e0: 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61 74  Size(pPage, &dat
f5f0: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 20 20  a[pc]);.        
f600: 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
f610: 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
f620: 20 20 20 20 20 20 20 69 66 28 20 70 63 2b 73 7a         if( pc+sz
f630: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
f640: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f650: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f660: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
f670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
f680: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
f690: 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20  iCellLast++;.   
f6a0: 20 7d 20 20 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d   }  ..    /* Com
f6b0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
f6c0: 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
f6d0: 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 45 56 49   page.    ** EVI
f6e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38  DENCE-OF: R-2358
f6f0: 38 2d 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d  8-34450 The two-
f700: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
f710: 6f 66 66 73 65 74 20 31 20 67 69 76 65 73 20 74  offset 1 gives t
f720: 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20  he.    ** start 
f730: 6f 66 20 74 68 65 20 66 69 72 73 74 20 66 72 65  of the first fre
f740: 65 62 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61  eblock on the pa
f750: 67 65 2c 20 6f 72 20 69 73 20 7a 65 72 6f 20 69  ge, or is zero i
f760: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  f there are no. 
f770: 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 73     ** freeblocks
f780: 2e 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20 67 65  . */.    pc = ge
f790: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
f7a0: 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65 65 20  +1]);.    nFree 
f7b0: 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
f7c0: 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46  top;  /* Init nF
f7d0: 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62  ree to non-freeb
f7e0: 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20  lock free space 
f7f0: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 63  */.    while( pc
f800: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20  >0 ){.      u16 
f810: 6e 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20  next, size;.    
f820: 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
f830: 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
f840: 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ast ){.        /
f850: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
f860: 2d 35 35 35 33 30 2d 35 32 39 33 30 20 49 6e 20  -55530-52930 In 
f870: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d  a well-formed b-
f880: 74 72 65 65 20 70 61 67 65 2c 20 74 68 65 72 65  tree page, there
f890: 20 77 69 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a   will.        **
f8a0: 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65   always be at le
f8b0: 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65 66  ast one cell bef
f8c0: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66 72  ore the first fr
f8d0: 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  eeblock..       
f8e0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f   **.        ** O
f8f0: 72 2c 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b  r, the freeblock
f900: 20 69 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20   is off the end 
f910: 6f 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  of the page.    
f920: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
f930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f940: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
f950: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
f960: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
f970: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
f980: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
f990: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
f9a0: 69 66 28 20 28 6e 65 78 74 3e 30 20 26 26 20 6e  if( (next>0 && n
f9b0: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 29 20  ext<=pc+size+3) 
f9c0: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
f9d0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
f9e0: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
f9f0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
fa00: 64 69 6e 67 20 6f 72 64 65 72 2e 20 41 6e 64 20  ding order. And 
fa10: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
fa20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
fa30: 66 72 65 65 2d 62 6c 6f 63 6b 20 6d 75 73 74 20  free-block must 
fa40: 6c 69 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62  lie on the datab
fa50: 61 73 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ase page.  */.  
fa60: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fa70: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fa80: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
fa90: 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
faa0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
fab0: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  = next;.    }.. 
fac0: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
fad0: 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
fae0: 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
faf0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
fb00: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
fb10: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
fb20: 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
fb30: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
fb40: 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
fb50: 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
fb60: 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
fb70: 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
fb80: 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
fb90: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
fba0: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
fbb0: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
fbc0: 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
fbd0: 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
fbe0: 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
fbf0: 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
fc00: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
fc10: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
fc20: 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
fc30: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
fc40: 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
fc50: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
fc60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fc70: 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
fc80: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
fc90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fca0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
fcb0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
fcc0: 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43  (u16)(nFree - iC
fcd0: 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 20 20 70  ellFirst);.    p
fce0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
fcf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
fd00: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fd10: 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77 20  ** Set up a raw 
fd20: 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74 20  page so that it 
fd30: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74  looks like a dat
fd40: 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69  abase page holdi
fd50: 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73  ng.** no entries
fd60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fd70: 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67   zeroPage(MemPag
fd80: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c  e *pPage, int fl
fd90: 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ags){.  unsigned
fda0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50   char *data = pP
fdb0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74  age->aData;.  Bt
fdc0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
fdd0: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68  age->pBt;.  u8 h
fde0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
fdf0: 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72  ffset;.  u16 fir
fe00: 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  st;..  assert( s
fe10: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
fe20: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
fe30: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67  Page)==pPage->pg
fe40: 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
fe50: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
fe60: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
fe70: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
fe80: 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
fe90: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
fea0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
feb0: 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b  Page) == data );
fec0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fed0: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
fee0: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
fef0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
ff00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ff10: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
ff20: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ;.  if( pBt->bts
ff30: 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
ff40: 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
ff50: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
ff60: 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61 62  r], 0, pBt->usab
ff70: 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 0a 20  leSize - hdr);. 
ff80: 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d   }.  data[hdr] =
ff90: 20 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20   (char)flags;.  
ffa0: 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20 28 28  first = hdr + ((
ffb0: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
ffc0: 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b 0a 20 20  =0 ? 12 : 8);.  
ffd0: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72  memset(&data[hdr
ffe0: 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61  +1], 0, 4);.  da
fff0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
10000 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
10010 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61  hdr+5], pBt->usa
10020 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  bleSize);.  pPag
10030 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
10040 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
10050 20 2d 20 66 69 72 73 74 29 3b 0a 20 20 64 65 63   - first);.  dec
10060 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
10070 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d  flags);.  pPage-
10080 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69  >cellOffset = fi
10090 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44  rst;.  pPage->aD
100a0 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 70  ataEnd = &data[p
100b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
100c0 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  .  pPage->aCellI
100d0 64 78 20 3d 20 26 64 61 74 61 5b 66 69 72 73 74  dx = &data[first
100e0 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74  ];.  pPage->aDat
100f0 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
10100 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
10110 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  e];.  pPage->nOv
10120 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
10130 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
10140 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
10150 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
10160 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
10170 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
10180 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
10190 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ;.  pPage->nCell
101a0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69   = 0;.  pPage->i
101b0 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  sInit = 1;.}.../
101c0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44  *.** Convert a D
101d0 62 50 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66  bPage obtained f
101e0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e  rom the pager in
101f0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65  to a MemPage use
10200 64 20 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65  d by.** the btre
10210 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74  e layer..*/.stat
10220 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
10230 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
10240 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  DbPage *pDbPage,
10250 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68   Pgno pgno, BtSh
10260 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
10270 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28  mPage *pPage = (
10280 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
10290 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
102a0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 67  bPage);.  if( pg
102b0 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20  no!=pPage->pgno 
102c0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  ){.    pPage->aD
102d0 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ata = sqlite3Pag
102e0 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
102f0 65 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  e);.    pPage->p
10300 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
10310 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74  ;.    pPage->pBt
10320 20 3d 20 70 42 74 3b 0a 20 20 20 20 70 50 61 67   = pBt;.    pPag
10330 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
10340 20 20 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66      pPage->hdrOf
10350 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f  fset = pgno==1 ?
10360 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20   100 : 0;.  }.  
10370 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
10380 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
10390 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
103a0 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e) );.  return p
103b0 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page; .}../*.** 
103c0 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
103d0 74 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74  the pager.  Init
103e0 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
103f0 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
10400 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
10410 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 20  ents if needed. 
10420 20 53 65 65 20 61 6c 73 6f 3a 20 62 74 72 65 65   See also: btree
10430 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 29 2e  GetUnusedPage().
10440 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 41  .**.** If the PA
10450 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
10460 54 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  T flag is set, i
10470 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
10480 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a 2a 20 61  do not care.** a
10490 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  bout the content
104a0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
104b0 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
104c0 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
104d0 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
104e0 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
104f0 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
10500 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
10510 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
10520 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
10530 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
10540 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
10550 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
10560 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
10570 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
10580 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
10590 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
105a0 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
105b0 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
105c0 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
105d0 20 69 6e 74 20 62 74 72 65 65 47 65 74 50 61 67   int btreeGetPag
105e0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
105f0 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
10600 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
10610 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
10620 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
10630 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
10640 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
10650 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
10660 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
10670 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
10680 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
10690 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
106a0 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
106b0 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
106c0 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
106d0 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
106e0 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
106f0 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20  rt( flags==0 || 
10700 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54  flags==PAGER_GET
10710 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c  _NOCONTENT || fl
10720 61 67 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 52  ags==PAGER_GET_R
10730 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20 61 73 73  EADONLY );.  ass
10740 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10750 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
10760 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
10770 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
10780 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
10790 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
107a0 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69  age, flags);.  i
107b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
107c0 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
107d0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
107e0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
107f0 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
10800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10810 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
10820 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
10830 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
10840 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
10850 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
10860 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
10870 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
10880 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
10890 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
108a0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
108b0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
108c0 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
108d0 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
108e0 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
108f0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
10900 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
10910 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
10920 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10930 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
10940 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
10950 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
10960 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
10970 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
10980 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
10990 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
109a0 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
109b0 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
109c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
109d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
109e0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
109f0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
10a00 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
10a10 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
10a20 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
10a30 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
10a40 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
10a50 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 42  btreePagecount(B
10a60 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10a70 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 6e 50 61   return pBt->nPa
10a80 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65  ge;.}.u32 sqlite
10a90 33 42 74 72 65 65 4c 61 73 74 50 61 67 65 28 42  3BtreeLastPage(B
10aa0 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
10ab0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
10ac0 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
10ad0 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 2d 3e  .  assert( ((p->
10ae0 70 42 74 2d 3e 6e 50 61 67 65 29 26 30 78 38 30  pBt->nPage)&0x80
10af0 30 30 30 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72  00000)==0 );.  r
10b00 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 63  eturn btreePagec
10b10 6f 75 6e 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a  ount(p->pBt);.}.
10b20 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
10b30 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
10b40 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
10b50 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75  it..**.** If pCu
10b60 72 21 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61  r!=0 then the pa
10b70 67 65 20 69 73 20 62 65 69 6e 67 20 66 65 74 63  ge is being fetc
10b80 68 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  hed as part of a
10b90 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a   moveToChild().*
10ba0 2a 20 63 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69  * call.  Do addi
10bb0 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  tional sanity ch
10bc0 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
10bd0 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
10be0 0a 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 66  .** And if the f
10bf0 65 74 63 68 20 66 61 69 6c 73 2c 20 74 68 69 73  etch fails, this
10c00 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 64 65   routine must de
10c10 63 72 65 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50  crement pCur->iP
10c20 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  age..**.** The p
10c30 61 67 65 20 69 73 20 66 65 74 63 68 65 64 20 61  age is fetched a
10c40 73 20 72 65 61 64 2d 77 72 69 74 65 20 75 6e 6c  s read-write unl
10c50 65 73 73 20 70 43 75 72 20 69 73 20 6e 6f 74 20  ess pCur is not 
10c60 4e 55 4c 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61  NULL and is.** a
10c70 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f   read-only curso
10c80 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
10c90 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
10ca0 6e 20 2a 70 70 50 61 67 65 20 69 73 20 75 6e 64  n *ppPage is und
10cb0 65 66 69 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61  efined. It.** ma
10cc0 79 20 72 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67  y remain unchang
10cd0 65 64 2c 20 6f 72 20 69 74 20 6d 61 79 20 62 65  ed, or it may be
10ce0 20 73 65 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c   set to an inval
10cf0 69 64 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  id value..*/.sta
10d00 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
10d10 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
10d20 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
10d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10d40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
10d50 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10d80 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65 74   the page to get
10d90 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
10da0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
10db0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
10dc0 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
10dd0 68 65 72 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  here */.  BtCurs
10de0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
10df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
10e00 73 6f 72 20 74 6f 20 72 65 63 65 69 76 65 20 74  sor to receive t
10e10 68 65 20 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c  he page, or NULL
10e20 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 61 64 4f   */.  int bReadO
10e30 6e 6c 79 20 20 20 20 20 20 20 20 20 20 20 20 20  nly             
10e40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
10e50 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61  r a read-only pa
10e60 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ge */.){.  int r
10e70 63 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  c;.  DbPage *pDb
10e80 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
10e90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10ea0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
10eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
10ec0 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26  ==0 || ppPage==&
10ed0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
10ee0 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
10ef0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
10f00 7c 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75  | bReadOnly==pCu
10f10 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
10f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
10f30 75 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69  ur==0 || pCur->i
10f40 50 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28  Page>0 );..  if(
10f50 20 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63   pgno>btreePagec
10f60 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
10f70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
10f80 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67  RUPT_BKPT;.    g
10f90 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
10fa0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
10fb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10fc0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
10fd0 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
10fe0 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
10ff0 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
11000 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
11010 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11020 72 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  r;.  }.  *ppPage
11030 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
11040 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11050 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
11060 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49  ( (*ppPage)->isI
11070 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74  nit==0 ){.    bt
11080 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
11090 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
110a0 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20   pBt);.    rc = 
110b0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70  btreeInitPage(*p
110c0 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
110d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
110e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
110f0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
11100 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11110 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11120 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
11130 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e  ( (*ppPage)->pgn
11140 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  o==pgno );.  ass
11150 65 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e  ert( (*ppPage)->
11160 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
11170 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
11180 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ge) );..  /* If 
11190 6f 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c  obtaining a chil
111a0 64 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72  d page for a cur
111b0 73 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72  sor, we must ver
111c0 69 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67  ify that the pag
111d0 65 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74  e is.  ** compat
111e0 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f  ible with the ro
111f0 6f 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66  ot page. */.  if
11200 28 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50  ( pCur && ((*ppP
11210 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c  age)->nCell<1 ||
11220 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b   (*ppPage)->intK
11230 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey!=pCur->curInt
11240 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  Key) ){.    rc =
11250 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11260 42 4b 50 54 3b 0a 20 20 20 20 72 65 6c 65 61 73  BKPT;.    releas
11270 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
11280 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
11290 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
112a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
112b0 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e  TE_OK;..getAndIn
112c0 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20  itPage_error:.  
112d0 69 66 28 20 70 43 75 72 20 29 20 70 43 75 72 2d  if( pCur ) pCur-
112e0 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 74 65 73 74  >iPage--;.  test
112f0 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
11300 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
11310 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
11320 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
11330 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11340 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
11350 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
11360 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
11370 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
11380 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
11390 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
113a0 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
113b0 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61  ageNotNull(MemPa
113c0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73  ge *pPage){.  as
113d0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
113e0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
113f0 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
11400 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11410 44 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61  DbPage!=0 );.  a
11420 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11430 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
11440 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
11450 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
11460 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11470 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
11480 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
11490 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
114a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
114b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
114c0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
114d0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
114e0 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  nrefNotNull(pPag
114f0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73  e->pDbPage);.}.s
11500 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
11510 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
11520 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50  pPage){.  if( pP
11530 61 67 65 20 29 20 72 65 6c 65 61 73 65 50 61 67  age ) releasePag
11540 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b  eNotNull(pPage);
11550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
11560 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
11570 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
11580 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
11590 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
115a0 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
115b0 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
115c0 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
115d0 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
115e0 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
115f0 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
11600 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
11610 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
11620 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
11630 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
11640 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
11650 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
11660 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
11670 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
11680 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
11690 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
116a0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
116b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
116c0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
116d0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
116e0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
116f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
11700 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
11710 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
11720 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
11730 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
11740 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
11750 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
11760 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
11770 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
11780 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
11790 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
117a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
117b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
117c0 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
117d0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
117e0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
117f0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
11800 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
11810 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
11820 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
11830 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
11840 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
11850 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
11860 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
11870 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
11880 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
11890 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
118a0 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
118b0 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
118c0 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
118d0 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
118e0 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
118f0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
11900 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
11910 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
11920 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
11930 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
11940 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
11950 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
11960 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11970 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
11980 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
11990 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
119a0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
119b0 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
119c0 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
119d0 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
119e0 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
119f0 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
11a00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
11a10 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
11a20 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
11a30 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
11a40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11a50 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
11a60 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
11a70 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
11a80 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
11a90 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11aa0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
11ab0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
11ac0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
11ad0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
11ae0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
11af0 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
11b00 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
11b10 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
11b20 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
11b30 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
11b40 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
11b50 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
11b60 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
11b70 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
11b80 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
11b90 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
11ba0 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
11bb0 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
11bc0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
11bd0 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
11be0 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
11bf0 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
11c00 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
11c10 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
11c20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
11c30 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
11c40 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
11c50 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
11c60 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
11c70 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
11c80 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
11c90 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
11ca0 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
11cb0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
11cc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
11cd0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
11ce0 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
11cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
11d00 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
11d10 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
11d20 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
11d30 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
11d40 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
11d50 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
11d60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
11d70 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
11d80 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
11d90 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
11da0 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
11db0 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
11dc0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
11dd0 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
11de0 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
11df0 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
11e00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11e10 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
11e20 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74  ame is NULL.** t
11e30 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  hen an ephemeral
11e40 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65   database is cre
11e50 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65 6d  ated.  The ephem
11e60 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d 69  eral database mi
11e70 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75 73  ght.** be exclus
11e80 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  ively in memory,
11e90 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73 65   or it might use
11ea0 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d 65   a disk-based me
11eb0 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20 45  mory cache..** E
11ec0 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 65  ither way, the e
11ed0 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
11ee0 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  e will be automa
11ef0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
11f00 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65 33  .** when sqlite3
11f10 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20  BtreeClose() is 
11f20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
11f30 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
11f40 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e  memory:" then an
11f50 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
11f60 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ase is created.*
11f70 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61  * that is automa
11f80 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65  tically destroye
11f90 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  d when it is clo
11fa0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22  sed..**.** The "
11fb0 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65 72  flags" parameter
11fc0 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 68   is a bitmask th
11fd0 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  at might contain
11fe0 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42 54   bits like.** BT
11ff0 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  REE_OMIT_JOURNAL
12000 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d 45   and/or BTREE_ME
12010 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  MORY..**.** If t
12020 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
12030 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
12040 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
12050 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
12060 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
12070 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
12080 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
12090 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
120a0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
120b0 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
120c0 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
120d0 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
120e0 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
120f0 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
12100 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
12110 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
12120 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
12130 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
12140 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
12150 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
12160 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
12170 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74  s,      /* VFS t
12180 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 62  o use for this b
12190 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  -tree */.  const
121a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
121b0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
121c0 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  e file containin
121d0 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74 61  g the BTree data
121e0 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  base */.  sqlite
121f0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
12200 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20    /* Associated 
12210 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
12220 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42  */.  Btree **ppB
12230 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  tree,        /* 
12240 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42  Pointer to new B
12250 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74  tree object writ
12260 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
12270 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
12280 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73        /* Options
12290 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
122a0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
122b0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 68   Flags passed th
122c0 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33  rough to sqlite3
122d0 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a  _vfs.xOpen() */.
122e0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
122f0 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Bt = 0;         
12300 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70 61      /* Shared pa
12310 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72 75  rt of btree stru
12320 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65 65  cture */.  Btree
12330 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
12340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
12350 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  dle to return */
12360 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
12370 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30 3b   *mutexOpen = 0;
12380 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61 20    /* Prevents a 
12390 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e 20  race condition. 
123a0 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f 0a  Ticket #3537 */.
123b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
123c0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
123d0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
123e0 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69  from this functi
123f0 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73 65  on */.  u8 nRese
12400 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rve;            
12410 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
12420 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 6f  f unused space o
12430 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
12440 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
12450 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20 20  DbHeader[100];  
12460 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
12470 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  er content */.. 
12480 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65 6e   /* True if open
12490 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c  ing an ephemeral
124a0 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  , temporary data
124b0 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  base */.  const 
124c0 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20 7a  int isTempDb = z
124d0 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
124e0 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a  Filename[0]==0;.
124f0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76 61  .  /* Set the va
12500 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20 74  riable isMemdb t
12510 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69 6e  o true for an in
12520 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
12530 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73 65  , or .  ** false
12540 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73 65   for a file-base
12550 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  d database..  */
12560 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
12570 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 63  MIT_MEMORYDB.  c
12580 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
12590 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63 6f   = 0;.#else.  co
125a0 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20  nst int isMemdb 
125b0 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  = (zFilename && 
125c0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
125d0 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  , ":memory:")==0
125e0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
125f0 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 54           || (isT
12600 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65 33  empDb && sqlite3
12610 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62 29  TempInMemory(db)
12620 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
12630 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66 73           || (vfs
12640 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
12650 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a  PEN_MEMORY)!=0;.
12660 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
12670 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
12680 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b 0a  ert( pVfs!=0 );.
12690 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
126a0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
126b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
126c0 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66 66  ert( (flags&0xff
126d0 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f 2a  )==flags );   /*
126e0 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38 20   flags fit in 8 
126f0 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e  bits */..  /* On
12700 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47 4c  ly a BTREE_SINGL
12710 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  E database can b
12720 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  e BTREE_UNORDERE
12730 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  D */.  assert( (
12740 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55 4e  flags & BTREE_UN
12750 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20 28  ORDERED)==0 || (
12760 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
12770 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20 2f  NGLE)!=0 );..  /
12780 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  * A BTREE_SINGLE
12790 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 77   database is alw
127a0 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ays a temporary 
127b0 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61 6c  and/or ephemeral
127c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 66   */.  assert( (f
127d0 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49 4e  lags & BTREE_SIN
127e0 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65 6d  GLE)==0 || isTem
127f0 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69 73  pDb );..  if( is
12800 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c 61  Memdb ){.    fla
12810 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d 4f  gs |= BTREE_MEMO
12820 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 76  RY;.  }.  if( (v
12830 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
12840 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d  _OPEN_MAIN_DB)!=
12850 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c 7c  0 && (isMemdb ||
12860 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20 20   isTempDb) ){.  
12870 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
12880 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
12890 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
128a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
128b0 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  P_DB;.  }.  p = 
128c0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
128d0 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
128e0 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
128f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12900 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
12910 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
12920 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
12930 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
12940 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12950 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
12960 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
12970 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
12980 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
12990 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
129a0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
129b0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
129c0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
129d0 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
129e0 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
129f0 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
12a00 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
12a10 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
12a20 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
12a30 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
12a40 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
12a50 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
12a60 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
12a70 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
12a80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
12a90 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
12aa0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12ab0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
12ac0 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
12ad0 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
12ae0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
12af0 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
12b00 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
12b10 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
12b20 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
12b30 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
12b40 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
12b50 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
12b60 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
12b70 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
12b80 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
12b90 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
12ba0 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
12bb0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
12bc0 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
12bd0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
12be0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
12bf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12c00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12c10 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
12c20 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
12c30 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74   memcpy(zFullPat
12c40 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  hname, zFilename
12c50 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , nFilename);.  
12c60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12c80 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56  sFullPathname(pV
12c90 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  fs, zFilename,. 
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cc0 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c    nFullPathname,
12cd0 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
12ce0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
12cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12d00 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
12d10 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
12d20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12d30 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  (p);.          r
12d40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12d50 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20    }.      }.#if 
12d60 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
12d70 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65  E.      mutexOpe
12d80 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  n = sqlite3Mutex
12d90 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
12da0 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b  EX_STATIC_OPEN);
12db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
12dc0 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
12dd0 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74  Open);.      mut
12de0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
12df0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
12e00 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
12e10 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
12e20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12e30 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29  ter(mutexShared)
12e40 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66  ;.#endif.      f
12e50 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74  or(pBt=GLOBAL(Bt
12e60 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
12e70 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
12e80 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70   pBt; pBt=pBt->p
12e90 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61  Next){.        a
12ea0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66  ssert( pBt->nRef
12eb0 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
12ec0 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c  ( 0==strcmp(zFul
12ed0 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74  lPathname, sqlit
12ee0 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28  e3PagerFilename(
12ef0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29  pBt->pPager, 0))
12f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f10 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65    && sqlite3Page
12f20 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72  rVfs(pBt->pPager
12f30 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20  )==pVfs ){.     
12f40 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20       int iDb;.  
12f50 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d          for(iDb=
12f60 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d  db->nDb-1; iDb>=
12f70 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20  0; iDb--){.     
12f80 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45         Btree *pE
12f90 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44  xisting = db->aD
12fa0 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20  b[iDb].pBt;.    
12fb0 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69          if( pExi
12fc0 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69  sting && pExisti
12fd0 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a  ng->pBt==pBt ){.
12fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
12ff0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13000 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
13020 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
13030 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
13040 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
13050 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
13060 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
13070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
13080 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
13090 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
130a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a  ITE_CONSTRAINT;.
130b0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
130c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
130d0 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
130e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d  ;.          pBt-
130f0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRef++;.       
13100 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
13110 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13120 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13130 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
13140 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
13150 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
13160 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  name);.    }.#if
13170 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
13180 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
13190 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64   /* In debug mod
131a0 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70  e, we mark all p
131b0 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61  ersistent databa
131c0 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a  ses as sharable.
131d0 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68        ** even wh
131e0 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e  en they are not.
131f0 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73    This exercises
13200 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64   the locking cod
13210 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67  e and.      ** g
13220 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74  ives more opport
13230 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74  unity for assert
13240 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  s(sqlite3_mutex_
13250 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a  held()).      **
13260 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66   statements to f
13270 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62  ind locking prob
13280 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lems..      */. 
13290 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
132a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
132b0 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  if.  }.#endif.  
132c0 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20  if( pBt==0 ){.  
132d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
132e0 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
132f0 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  s make sure that
13300 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64   structures used
13310 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72   by the btree ar
13320 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67  e.    ** the rig
13330 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69  ht size.  This i
13340 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e  s to guard again
13350 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20  st size changes 
13360 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20  that result.    
13370 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e  ** when compilin
13380 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  g on a different
13390 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20   architecture.. 
133a0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
133b0 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38  ( sizeof(i64)==8
133c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
133d0 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29  sizeof(u64)==8 )
133e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
133f0 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a  zeof(u32)==4 );.
13400 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
13410 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20  of(u16)==2 );.  
13420 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
13430 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a  (Pgno)==4 );.  .
13440 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65      pBt = sqlite
13450 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
13460 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20  eof(*pBt) );.   
13470 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
13480 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13490 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
134a0 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
134b0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
134c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
134d0 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
134e0 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
134f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13500 20 20 20 20 20 20 20 20 20 20 20 20 45 58 54 52              EXTR
13510 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76  A_SIZE, flags, v
13520 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
13530 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
13540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13550 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
13560 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
13570 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
13580 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
13590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
135a0 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
135b0 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
135c0 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
135d0 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
135e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
135f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
13600 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
13610 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
13620 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
13630 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
13640 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
13650 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
13660 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yhandler(pBt->pP
13670 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
13680 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
13690 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
136a0 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
136b0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
136c0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
136d0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
136e0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
136f0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
13700 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
13710 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
13720 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
13730 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20  SECURE_DELETE.  
13740 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
13750 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  |= BTS_SECURE_DE
13760 4c 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LETE;.#endif.   
13770 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
13780 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
13790 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
137a0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
137b0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
137c0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
137d0 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
137e0 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
137f0 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
13800 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
13810 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
13820 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
13830 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
13840 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31  e = (zDbHeader[1
13850 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61  6]<<8) | (zDbHea
13860 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  der[17]<<16);.  
13870 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
13880 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
13890 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
138a0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
138b0 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
138c0 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
138d0 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
138e0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
138f0 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
13900 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13910 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
13920 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
13930 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
13940 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
13950 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
13960 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
13970 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
13980 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
13990 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
139a0 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
139b0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
139c0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
139d0 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
139e0 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
139f0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
13a00 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
13a10 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
13a20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
13a30 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
13a40 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
13a50 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
13a60 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
13a70 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
13a80 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
13a90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
13aa0 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
13ab0 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
13ac0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
13ad0 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
13ae0 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
13af0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
13b00 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
13b10 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13b20 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
13b30 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
13b40 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
13b50 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
13b60 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  lse{.      /* EV
13b70 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
13b80 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
13b90 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
13ba0 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
13bb0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
13bc0 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
13bd0 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
13be0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
13bf0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20  set of 20.      
13c00 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
13c10 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
13c20 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65  . */.      nRese
13c30 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
13c40 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
13c50 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
13c60 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
13c70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13c80 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
13c90 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
13ca0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
13cb0 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b  (&zDbHeader[36 +
13cc0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
13cd0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13ce0 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
13cf0 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37  zDbHeader[36 + 7
13d00 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69  *4])?1:0);.#endi
13d10 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  f.    }.    rc =
13d20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
13d30 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
13d40 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
13d50 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
13d60 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
13d70 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
13d80 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62  t;.    pBt->usab
13d90 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
13da0 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
13db0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
13dc0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
13dd0 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
13de0 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
13df0 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
13e00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
13e10 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
13e20 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
13e30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13e40 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
13e50 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
13e60 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
13e70 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
13e80 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
13e90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13ea0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
13eb0 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
13ec0 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
13ed0 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
13ee0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66  .      pBt->nRef
13ef0 20 3d 20 31 3b 0a 20 20 20 20 20 20 4d 55 54 45   = 1;.      MUTE
13f00 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68  X_LOGIC( mutexSh
13f10 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
13f20 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
13f30 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
13f40 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28  TER);).      if(
13f50 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
13f60 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f  FE && sqlite3Glo
13f70 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
13f80 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  utex ){.        
13f90 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  pBt->mutex = sql
13fa0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
13fb0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
13fc0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
13fd0 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  Bt->mutex==0 ){.
13fe0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
13ff0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
14000 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
14010 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20  cFailed = 0;.   
14020 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
14030 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
14040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14050 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14060 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
14070 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
14080 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
14090 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
140a0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
140b0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
140c0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
140d0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
140e0 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
140f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14100 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14110 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14120 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
14130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14140 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14150 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14160 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
14170 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
14180 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
14190 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
141a0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
141b0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
141c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
141d0 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
141e0 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
141f0 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
14200 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
14210 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
14220 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
14230 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
14240 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
14250 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
14260 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
14270 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
14280 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
14290 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
142a0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
142b0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
142c0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
142d0 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
142e0 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
142f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14300 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
14310 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
14320 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
14330 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
14340 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
14350 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
14360 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14370 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
14380 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
14390 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
143a0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
143b0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
143c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
143d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
143e0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
143f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14400 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14410 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14420 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14430 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14440 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14460 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
14470 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
14480 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14490 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
144a0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
144b0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
144c0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
144d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
144e0 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
144f0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14500 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14510 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
14520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14530 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14540 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14550 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
14560 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
14570 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
14580 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
14590 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
145a0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
145b0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
145c0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
145d0 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
145e0 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
145f0 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
14600 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
14610 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
14620 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
14630 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
14640 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
14650 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
14660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
14670 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
14680 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
14690 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
146a0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
146b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
146c0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
146d0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
146e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
146f0 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
14700 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14710 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
14720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
14740 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
14750 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
14760 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
14770 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
14780 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
14790 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
147a0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
147b0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
147c0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
147d0 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
147e0 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
147f0 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
14800 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
14810 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
14820 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
14830 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
14840 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
14850 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14860 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
14870 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
14880 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
14890 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
148a0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
148b0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
148c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
148d0 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
148e0 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
148f0 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
14900 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
14910 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14920 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
14930 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
14940 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
14950 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
14960 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
14970 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
14980 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14990 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
149a0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
149b0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
149c0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
149d0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
149e0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
149f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14a00 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
14a10 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14a20 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
14a30 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
14a40 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
14a50 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
14a60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
14a70 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
14a80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14a90 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
14aa0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
14ab0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
14ac0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
14ad0 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
14ae0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
14af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14b00 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
14b10 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
14b20 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
14b30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
14b40 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
14b50 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
14b60 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
14b70 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
14b80 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14b90 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
14ba0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
14bb0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
14bc0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
14bd0 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
14be0 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
14bf0 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
14c00 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
14c10 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
14c20 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
14c30 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
14c40 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
14c50 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
14c60 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
14c70 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
14c80 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
14c90 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
14ca0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
14cb0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
14cc0 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
14cd0 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
14ce0 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
14cf0 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
14d00 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
14d10 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
14d20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
14d30 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
14d40 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
14d50 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
14d60 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
14d70 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
14d80 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
14d90 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
14da0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
14db0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
14dc0 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
14dd0 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
14de0 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
14df0 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
14e00 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
14e10 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
14e20 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
14e30 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
14e40 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
14e50 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
14e60 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
14e70 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
14e80 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
14e90 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
14ea0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
14eb0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
14ec0 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
14ed0 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
14ee0 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
14ef0 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
14f00 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
14f10 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
14f20 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
14f30 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
14f40 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
14f50 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
14f60 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
14f70 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
14f80 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
14f90 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
14fa0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
14fb0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
14fc0 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
14fd0 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
14fe0 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
14ff0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
15000 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
15010 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
15020 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
15030 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
15040 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
15050 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
15060 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
15070 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
15080 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
15090 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
150a0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
150b0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
150c0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
150d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
150e0 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
150f0 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
15100 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
15110 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
15120 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
15130 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
15140 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
15150 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
15160 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15170 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
15180 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
15190 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
151a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
151b0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
151c0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
151d0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
151e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
151f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15200 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15210 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15220 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
15230 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
15240 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
15250 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
15260 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
15270 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
15280 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
15290 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
152a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
152b0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
152c0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
152d0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
152e0 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
152f0 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
15300 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
15310 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
15320 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
15330 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
15340 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
15350 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
15360 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
15370 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
15380 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
15390 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
153a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
153b0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
153c0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
153d0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
153e0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
153f0 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
15400 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
15410 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
15420 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
15430 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
15440 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
15450 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
15460 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
15470 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
15480 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
15490 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
154a0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
154b0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
154c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
154d0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
154e0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
154f0 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
15500 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
15510 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
15520 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
15530 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
15540 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
15550 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
15560 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
15570 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
15580 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
15590 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
155a0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
155b0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
155c0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
155d0 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
155e0 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
155f0 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
15600 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15610 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
15620 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
15630 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
15640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15650 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
15660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15670 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
15680 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
15690 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
156a0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
156b0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
156c0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
156d0 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
156e0 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
156f0 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
15700 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
15710 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
15720 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
15730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15750 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69   the "soft" limi
15760 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
15770 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
15780 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64  cache..** Unused
15790 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20   and unmodified 
157a0 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65  pages will be re
157b0 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20  cycled when the 
157c0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
157d0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
157e0 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66  exceeds this sof
157f0 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68  t limit.  But th
15800 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
15810 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65   cache is allowe
15820 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72  d to grow larger
15830 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74   than this limit
15840 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a   if it contains.
15850 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f  ** dirty pages o
15860 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e  r pages still in
15870 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a   active use..*/.
15880 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15890 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
158a0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
158b0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
158c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
158d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
158e0 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
158f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15900 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15910 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
15920 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
15930 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15940 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15950 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15970 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15980 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d   the "spill" lim
15990 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
159a0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
159b0 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68   cache..** If th
159c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
159d0 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c  s exceeds this l
159e0 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72  imit during a wr
159f0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
15a00 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69  .** the pager mi
15a10 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22  ght attempt to "
15a20 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20  spill" pages to 
15a30 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c  the journal earl
15a40 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f  y in.** order to
15a50 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e   free up memory.
15a60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
15a70 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
15a80 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
15a90 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73  ize.  If zero is
15aa0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e   passed.** as an
15ab0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68   argument, no ch
15ac0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
15ad0 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  o the spill size
15ae0 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20   setting, so.** 
15af0 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20  using mxPage of 
15b00 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75  0 is a way to qu
15b10 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  ery the current 
15b20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69  spill size..*/.i
15b30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15b40 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65  etSpillSize(Btre
15b50 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
15b60 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15b70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15b80 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
15b90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15ba0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15bb0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15bc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15bd0 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67  res = sqlite3Pag
15be0 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  erSetSpillsize(p
15bf0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15c00 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15c10 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15c20 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
15c30 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
15c40 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
15c50 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
15c60 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
15c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15c80 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
15c90 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
15ca0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15cb0 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
15cc0 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
15cd0 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
15ce0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
15cf0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
15d00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15d10 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15d20 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15d30 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15d40 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
15d50 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
15d60 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
15d70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15d80 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15da0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15db0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
15dc0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
15dd0 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
15de0 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
15df0 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
15e00 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
15e10 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
15e20 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
15e30 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
15e40 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
15e50 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
15e60 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
15e70 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
15e80 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
15e90 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
15ea0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
15eb0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
15ec0 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
15ed0 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
15ee0 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
15ef0 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
15f00 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
15f10 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
15f20 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
15f30 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
15f40 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
15f50 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
15f60 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
15f70 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
15f80 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
15f90 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
15fa0 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
15fb0 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
15fc0 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15fe0 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
15ff0 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
16000 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
16010 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
16020 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
16030 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
16040 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16050 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
16060 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16070 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
16080 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
16090 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
160a0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
160b0 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
160c0 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
160d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
160e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
160f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16100 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
16110 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
16120 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
16130 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
16140 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
16150 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
16160 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
16170 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
16180 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
16190 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
161a0 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
161b0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
161c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
161d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
161e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
161f0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16200 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
16210 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16220 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
16230 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
16240 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16250 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
16260 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
16270 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16280 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16290 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
162a0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
162b0 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
162c0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
162d0 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
162e0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
162f0 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
16300 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
16310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
16320 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
16330 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
16340 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
16350 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
16360 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
16370 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
16380 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
16390 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
163a0 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
163b0 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
163c0 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
163d0 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
163e0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
163f0 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
16400 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
16410 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
16420 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
16430 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
16440 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
16450 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
16460 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
16470 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
16480 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
16490 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
164a0 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
164b0 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
164c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
164d0 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
164e0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
164f0 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
16500 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
16510 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16520 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
16530 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
16540 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
16550 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
16560 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45  hen the BTS_PAGE
16570 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20  SIZE_FIXED flag 
16580 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
16590 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
165a0 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
165b0 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
165c0 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
165d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
165e0 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
165f0 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
16600 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
16610 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
16620 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16630 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
16640 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16650 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
16660 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
16670 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
16680 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
16690 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
166a0 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73  CODEC.  if( nRes
166b0 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  erve>pBt->optima
166c0 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e  lReserve ) pBt->
166d0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d  optimalReserve =
166e0 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23   (u8)nReserve;.#
166f0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d  endif.  if( pBt-
16700 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16710 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
16720 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
16730 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
16740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
16750 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
16760 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
16770 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
16780 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
16790 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
167a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
167b0 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
167c0 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
167d0 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
167e0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
167f0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
16800 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
16810 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
16820 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
16830 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
16840 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
16850 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16860 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
16870 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
16880 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
16890 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
168a0 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
168b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
168c0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
168d0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
168e0 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
168f0 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
16900 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
16910 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
16920 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
16930 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
16940 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
16950 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
16960 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16980 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
16990 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
169a0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
169b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
169c0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
169d0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
169e0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
169f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
16a00 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
16a10 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  r to sqlite3Btre
16a20 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65  eGetReserve(), e
16a30 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
16a40 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
16a50 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61  led if it is gua
16a60 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
16a70 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
16a80 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64   already.** held
16a90 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
16aa0 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70  useful in one sp
16ab0 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68  ecial case in th
16ac0 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64  e backup API cod
16ad0 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a  e where it is.**
16ae0 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20   known that the 
16af0 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75  shared b-tree mu
16b00 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74  tex is held, but
16b10 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68   the mutex on th
16b20 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  e .** database h
16b30 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
16b40 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68  *p is not. In th
16b50 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74  is case if sqlit
16b60 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a  e3BtreeEnter().*
16b70 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c  * were to be cal
16b80 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f  led, it might co
16b90 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20  llide with some 
16ba0 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20  other operation 
16bb0 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
16bc0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
16bd0 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20  wns *p, causing 
16be0 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69  undefined behavi
16bf0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
16c00 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
16c10 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
16c20 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61  p){.  int n;.  a
16c30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16c40 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
16c50 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20  ->mutex) );.  n 
16c60 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
16c70 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
16c80 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  bleSize;.  retur
16c90 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n n;.}../*.** Re
16ca0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
16cb0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
16cc0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
16cd0 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
16ce0 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
16cf0 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
16d00 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
16d10 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
16d20 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
16d30 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
16d40 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  sions..**.** If 
16d50 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58  SQLITE_HAS_MUTEX
16d60 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
16d70 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   the number retu
16d80 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67  rned is the.** g
16d90 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75  reater of the cu
16da0 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73  rrent reserved s
16db0 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78  pace and the max
16dc0 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a  imum requested.*
16dd0 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e  * reserve space.
16de0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16df0 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65  treeGetOptimalRe
16e00 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
16e10 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
16e20 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16e30 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42  ;.  n = sqlite3B
16e40 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
16e50 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66  Mutex(p);.#ifdef
16e60 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
16e70 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74  C.  if( n<p->pBt
16e80 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16e90 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f   ) n = p->pBt->o
16ea0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23  ptimalReserve;.#
16eb0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42  endif.  sqlite3B
16ec0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16ed0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
16ee0 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
16ef0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
16f00 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
16f10 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
16f20 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
16f30 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
16f40 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
16f50 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
16f60 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
16f70 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
16f80 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
16f90 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
16fa0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16fb0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
16fc0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
16fd0 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
16fe0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16ff0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
17000 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
17010 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
17020 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
17030 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17040 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
17050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
17060 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
17070 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ETE flag if newF
17080 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
17090 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
170a0 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
170b0 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
170c0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
170d0 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53  lue of the BTS_S
170e0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  ECURE_DELETE.** 
170f0 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
17100 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
17110 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
17120 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
17130 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
17140 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
17150 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
17160 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17170 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
17180 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
17190 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
171a0 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52  gs &= ~BTS_SECUR
171b0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66  E_DELETE;.    if
171c0 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70  ( newFlag ) p->p
171d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
171e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
171f0 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70  E;.  } .  b = (p
17200 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
17210 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
17220 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  ETE)!=0;.  sqlit
17230 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17240 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
17250 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17260 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
17270 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
17280 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
17290 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
172a0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
172b0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
172c0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
172d0 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
172e0 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
172f0 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
17300 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
17310 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
17320 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
17330 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
17340 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
17350 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
17360 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17370 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
17380 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
17390 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
173a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
173b0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
173c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
173d0 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
173e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
173f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
17400 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
17410 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
17420 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
17430 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
17440 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
17450 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
17460 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
17470 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
17480 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
17490 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
174a0 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
174b0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
174c0 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
174d0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
174e0 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
174f0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
17500 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17510 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
17520 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17530 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
17540 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
17550 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
17560 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
17570 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
17580 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
17590 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
175a0 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
175b0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
175c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
175d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
175e0 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
175f0 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
17600 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
17610 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17620 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
17630 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
17640 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
17650 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
17660 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
17670 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
17680 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
17690 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
176a0 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
176b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
176c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
176d0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
176e0 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
176f0 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
17700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17710 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
17720 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
17730 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
17740 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
17750 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
17760 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
17770 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
17780 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
17790 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
177a0 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
177b0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
177c0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
177d0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
177e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
177f0 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
17800 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
17810 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
17820 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
17830 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
17840 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
17850 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
17860 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
17870 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
17880 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
17890 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
178a0 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
178b0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
178c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
178d0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
178e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
178f0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
17900 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
17910 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
17920 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
17930 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17940 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
17950 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
17960 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17970 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
17980 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
17990 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
179a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
179b0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
179c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
179d0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
179e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
179f0 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
17a00 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
17a10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17a20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17a30 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
17a40 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
17a50 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
17a60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
17a70 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
17a80 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
17a90 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
17aa0 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
17ab0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
17ac0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
17ad0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
17ae0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
17af0 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
17b00 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
17b10 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
17b20 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17b30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
17b40 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
17b50 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
17b60 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
17b70 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
17b80 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
17b90 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
17ba0 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
17bb0 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
17bc0 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
17bd0 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
17be0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
17bf0 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
17c00 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
17c10 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
17c20 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
17c30 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
17c40 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
17c50 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
17c60 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
17c70 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
17c80 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
17c90 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
17ca0 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
17cb0 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
17cc0 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
17cd0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
17ce0 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
17cf0 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
17d00 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
17d10 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
17d20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
17d30 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
17d40 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
17d50 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
17d60 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17d70 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
17d80 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17d90 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
17da0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17db0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
17dc0 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
17dd0 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
17de0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
17df0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
17e00 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
17e10 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
17e20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17e30 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
17e40 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
17e50 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
17e60 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
17e70 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
17e80 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
17e90 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
17ea0 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
17eb0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
17ec0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
17ed0 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
17ee0 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
17ef0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
17f00 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
17f10 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
17f20 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
17f30 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
17f40 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
17f50 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
17f60 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
17f70 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
17f80 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
17f90 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
17fa0 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
17fb0 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
17fc0 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
17fd0 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
17fe0 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
17ff0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
18000 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
18010 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
18020 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
18030 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
18040 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
18050 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
18060 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
18070 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
18080 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
18090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
180a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
180b0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
180c0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
180d0 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30  se if( isOpen==0
180e0 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
180f0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41  E_DEFAULT_WAL_SA
18100 46 45 54 59 4c 45 56 45 4c 0a 20 20 20 20 20 20  FETYLEVEL.      
18110 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 74 6f 20    /* Default to 
18120 73 70 65 63 69 66 69 65 64 20 73 61 66 65 74 79  specified safety
18130 5f 6c 65 76 65 6c 20 66 6f 72 20 57 41 4c 20 6d  _level for WAL m
18140 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ode */.        i
18150 66 28 20 70 42 74 2d 3e 64 62 21 3d 30 20 26 26  f( pBt->db!=0 &&
18160 20 70 42 74 2d 3e 64 62 2d 3e 61 44 62 21 3d 30   pBt->db->aDb!=0
18170 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
18180 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
18190 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
181a0 42 74 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  Bt->db;.        
181b0 20 20 44 62 20 2a 61 44 62 20 3d 20 64 62 2d 3e    Db *aDb = db->
181c0 61 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 75  aDb;.          u
181d0 38 20 6c 65 76 65 6c 20 3d 20 30 3b 0a 20 20 20  8 level = 0;.   
181e0 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30         for(iDb=0
181f0 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
18200 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Db++){.         
18210 20 20 20 69 66 28 20 61 44 62 5b 69 44 62 5d 2e     if( aDb[iDb].
18220 70 42 74 20 26 26 20 61 44 62 5b 69 44 62 5d 2e  pBt && aDb[iDb].
18230 70 42 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 20  pBt->pBt==pBt ) 
18240 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
18250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
18260 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
18270 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 65   );.          le
18280 76 65 6c 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  vel = db->aDb[iD
18290 62 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b  b].safety_level;
182a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
182b0 53 51 4c 49 54 45 5f 44 62 53 61 66 65 74 79 4c  SQLITE_DbSafetyL
182c0 65 76 65 6c 49 73 46 69 78 65 64 28 6c 65 76 65  evelIsFixed(leve
182d0 6c 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  l) && .         
182e0 20 20 20 20 28 53 51 4c 49 54 45 5f 44 62 53 61      (SQLITE_DbSa
182f0 66 65 74 79 4c 65 76 65 6c 56 61 6c 75 65 28 6c  fetyLevelValue(l
18300 65 76 65 6c 29 20 21 3d 20 53 51 4c 49 54 45 5f  evel) != SQLITE_
18310 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45  DEFAULT_WAL_SAFE
18320 54 59 4c 45 56 45 4c 29 20 29 7b 0a 20 20 20 20  TYLEVEL) ){.    
18330 20 20 20 20 20 20 20 20 61 44 62 5b 69 44 62 5d          aDb[iDb]
18340 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
18350 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18360 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 3b 0a  AL_SAFETYLEVEL;.
18370 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
18380 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
18390 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67  yLevel(pBt->pPag
183a0 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
183b0 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56  LT_WAL_SAFETYLEV
183c0 45 4c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  EL, .           
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183e0 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d              (db-
183f0 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 75  >flags&SQLITE_Fu
18400 6c 6c 46 53 79 6e 63 29 21 3d 30 2c 0a 20 20 20  llFSync)!=0,.   
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18430 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53      (db->flags&S
18440 51 4c 49 54 45 5f 43 6b 70 74 46 75 6c 6c 46 53  QLITE_CkptFullFS
18450 79 6e 63 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  ync)!=0);.      
18460 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
18470 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72  #endif.        r
18480 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
18490 31 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  1);.        retu
184a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
184b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
184c0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
184d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
184e0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
184f0 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20  : R-15465-20813 
18500 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  The maximum and 
18510 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  minimum embedded
18520 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20   payload.    ** 
18530 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68  fractions and th
18540 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66  e leaf payload f
18550 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d  raction values m
18560 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61  ust be 64, 32, a
18570 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  nd 32..    **.  
18580 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
18590 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
185a0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
185b0 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
185c0 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
185d0 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
185e0 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
185f0 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
18600 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
18610 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
18620 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
18630 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
18640 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
18650 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
18660 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
18670 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
18680 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
18690 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
186a0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
186b0 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
186c0 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
186d0 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
186e0 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
186f0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
18700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18710 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69  e. */.    pageSi
18720 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c  ze = (page1[16]<
18730 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d  <8) | (page1[17]
18740 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56  <<16);.    /* EV
18750 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30  IDENCE-OF: R-250
18760 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a  08-21688 The siz
18770 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61  e of a page is a
18780 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20   power of two.  
18790 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32    ** between 512
187a0 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75   and 65536 inclu
187b0 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sive. */.    if(
187c0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
187d0 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
187e0 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
187f0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
18800 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
18810 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
18820 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
18830 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
18840 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18850 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
18860 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =0 );.    /* EVI
18870 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31  DENCE-OF: R-5931
18880 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73  0-51205 The "res
18890 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a  erved space" siz
188a0 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a  e in the 1-byte.
188b0 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61      ** integer a
188c0 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74  t offset 20 is t
188d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
188e0 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
188f0 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
18900 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65   each page to re
18910 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73  serve for extens
18920 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  ions. .    **.  
18930 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
18940 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
18950 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
18960 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
18970 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
18980 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
18990 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
189a0 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
189b0 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
189c0 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
189d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
189e0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62  der. */.    usab
189f0 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
18a00 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
18a10 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65     if( (u32)page
18a20 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
18a30 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
18a40 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
18a50 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
18a60 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
18a70 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
18a80 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
18a90 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
18aa0 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
18ab0 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
18ac0 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
18ad0 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
18ae0 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
18af0 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
18b00 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
18b10 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
18b20 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18b30 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
18b40 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
18b50 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
18b60 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
18b70 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
18b80 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
18b90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
18ba0 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  ge1);.      pBt-
18bb0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
18bc0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
18bd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
18be0 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
18bf0 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
18c00 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  t);.      rc = s
18c10 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
18c20 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
18c30 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
18c40 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
18c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c60 20 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d         pageSize-
18c70 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
18c80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
18c90 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 42 74    }.    if( (pBt
18ca0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
18cb0 4c 49 54 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64  LITE_RecoveryMod
18cc0 65 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  e)==0 && nPage>n
18cd0 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
18ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
18cf0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
18d00 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18d10 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18d20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18d30 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
18d40 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
18d50 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
18d60 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
18d70 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
18d80 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
18d90 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
18da0 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
18db0 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
18dc0 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
18dd0 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
18de0 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
18df0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
18e00 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
18e10 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
18e20 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
18e30 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
18e40 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
18e50 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
18e60 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
18e70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
18e80 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
18e90 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
18ea0 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
18eb0 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
18ec0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
18ed0 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
18ee0 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
18ef0 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
18f00 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
18f10 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
18f20 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
18f30 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
18f40 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
18f50 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
18f60 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
18f70 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
18f80 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
18f90 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
18fa0 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
18fb0 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
18fc0 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
18fd0 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
18fe0 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
18ff0 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
19000 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
19010 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19020 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
19030 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
19040 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
19050 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
19060 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
19070 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
19080 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
19090 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
190a0 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
190b0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
190c0 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
190d0 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
190e0 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
190f0 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
19100 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
19110 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
19120 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
19130 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
19140 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
19150 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
19160 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
19170 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
19180 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
19190 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
191a0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
191b0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
191c0 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
191d0 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
191e0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
191f0 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
19200 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
19210 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
19220 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
19230 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
19240 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
19250 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
19260 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
19270 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
19280 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
19290 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
192a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
192b0 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
192c0 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
192d0 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
192e0 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
192f0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
19300 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
19310 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
19320 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
19330 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
19340 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65  1);.  pBt->pPage
19350 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  1 = 0;.  return 
19360 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
19370 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
19380 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
19390 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
193a0 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f   pBt. This is fo
193b0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
193c0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
193d0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
193e0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
193f0 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
19400 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  ined..**.** Only
19410 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61   write cursors a
19420 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72  re counted if wr
19430 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49  Only is true.  I
19440 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66  f wrOnly is.** f
19450 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75  alse then all cu
19460 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
19470 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
19480 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
19490 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72  s routine, a cur
194a0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
194b0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
194c0 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20  able of reading 
194d0 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  or writing to th
194e0 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75 72  e database.  Cur
194f0 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76  sors that.** hav
19500 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20 69  e been tripped i
19510 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46  nto the CURSOR_F
19520 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e  AULT state are n
19530 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73  ot counted..*/.s
19540 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56  tatic int countV
19550 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53 68  alidCursors(BtSh
19560 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77  ared *pBt, int w
19570 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  rOnly){.  BtCurs
19580 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
19590 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
195a0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
195b0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
195c0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
195d0 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28   (wrOnly==0 || (
195e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
195f0 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29   BTCF_WriteFlag)
19600 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43 75  !=0).     && pCu
19610 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
19620 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
19630 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
19640 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
19650 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
19660 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73  outstanding curs
19670 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e  ors and we are n
19680 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ot in the middle
19690 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63  .** of a transac
196a0 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69  tion but there i
196b0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
196c0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 74   the database, t
196d0 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
196e0 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20 66  ine unrefs the f
196f0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
19700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
19710 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65  hich .** has the
19720 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61   effect of relea
19730 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f  sing the read lo
19740 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
19750 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74  re is a transact
19760 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c  ion in progress,
19770 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19780 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
19790 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42  tic void unlockB
197a0 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53  treeIfUnused(BtS
197b0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61  hared *pBt){.  a
197c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
197d0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
197e0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
197f0 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
19800 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c  sors(pBt,0)==0 |
19810 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
19820 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
19830 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
19840 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
19850 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
19860 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
19870 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
19880 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
19890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
198a0 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
198b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
198c0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
198d0 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b  t->pPager)==1 );
198e0 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31  .    pBt->pPage1
198f0 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73   = 0;.    releas
19900 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
19910 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ge1);.  }.}../*.
19920 2a 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73  ** If pBt points
19930 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c   to an empty fil
19940 65 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  e then convert t
19950 68 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a  hat empty file.*
19960 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70  * into a new emp
19970 74 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69  ty database by i
19980 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
19990 66 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a  first page of.**
199a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
199b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77  /.static int new
199c0 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65  Database(BtShare
199d0 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61  d *pBt){.  MemPa
199e0 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67  ge *pP1;.  unsig
199f0 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a  ned char *data;.
19a00 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19a10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
19a20 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
19a30 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
19a40 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
19a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a60 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  K;.  }.  pP1 = p
19a70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
19a80 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
19a90 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
19aa0 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
19ab0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
19ac0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
19ad0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19ae0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
19af0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
19b00 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
19b10 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
19b20 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
19b30 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64  ader)==16 );.  d
19b40 61 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28  ata[16] = (u8)((
19b50 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38  pBt->pageSize>>8
19b60 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
19b70 31 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d  17] = (u8)((pBt-
19b80 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30  >pageSize>>16)&0
19b90 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d  xff);.  data[18]
19ba0 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d   = 1;.  data[19]
19bb0 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
19bc0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c  pBt->usableSize<
19bd0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  =pBt->pageSize &
19be0 26 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  & pBt->usableSiz
19bf0 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65  e+255>=pBt->page
19c00 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30  Size);.  data[20
19c10 5d 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61  ] = (u8)(pBt->pa
19c20 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
19c30 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  ableSize);.  dat
19c40 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61  a[21] = 64;.  da
19c50 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64  ta[22] = 32;.  d
19c60 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20  ata[23] = 32;.  
19c70 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d  memset(&data[24]
19c80 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20  , 0, 100-24);.  
19c90 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54  zeroPage(pP1, PT
19ca0 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
19cb0 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29  F|PTF_LEAFDATA )
19cc0 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  ;.  pBt->btsFlag
19cd0 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
19ce0 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
19cf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
19d00 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
19d10 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
19d20 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
19d30 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
19d40 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
19d50 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
19d60 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
19d70 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
19d80 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
19d90 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
19da0 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
19db0 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
19dc0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
19dd0 23 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50  #endif.  pBt->nP
19de0 61 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  age = 1;.  data[
19df0 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  31] = 1;.  retur
19e00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19e10 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
19e20 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
19e30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19e40 66 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61  file (creating a
19e50 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
19e60 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
19e70 67 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20  gle page and no 
19e80 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e  schema objects).
19e90 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
19ea0 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66  K.** if successf
19eb0 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
19ec0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
19ed0 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rwise..*/.int sq
19ee0 6c 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28  lite3BtreeNewDb(
19ef0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
19f00 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
19f10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
19f20 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30  ->pBt->nPage = 0
19f30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61  ;.  rc = newData
19f40 62 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20  base(p->pBt);.  
19f50 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19f60 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
19f70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
19f80 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
19f90 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
19fa0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
19fb0 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
19fc0 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
19fd0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
19fe0 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
19ff0 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
1a000 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
1a010 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1a020 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
1a030 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
1a040 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1a050 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
1a060 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
1a070 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
1a080 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
1a090 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
1a0a0 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
1a0b0 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
1a0c0 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
1a0d0 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
1a0e0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
1a0f0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
1a100 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
1a110 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
1a120 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
1a130 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
1a140 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1a150 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
1a160 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
1a170 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
1a180 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1a190 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
1a1a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
1a1b0 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
1a1c0 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
1a1d0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
1a1e0 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
1a1f0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1a200 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
1a210 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1a220 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
1a230 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1a240 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
1a250 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1a260 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
1a270 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1a280 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
1a290 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1a2a0 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
1a2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a2c0 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
1a2d0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
1a2e0 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
1a2f0 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
1a300 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
1a310 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
1a320 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
1a330 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
1a340 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
1a350 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
1a360 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
1a370 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
1a380 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
1a390 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
1a3a0 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
1a3b0 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
1a3c0 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
1a3d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
1a3e0 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
1a3f0 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
1a400 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
1a410 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
1a420 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
1a430 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
1a440 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
1a450 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
1a460 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
1a470 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
1a480 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
1a490 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1a4a0 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
1a4b0 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
1a4c0 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
1a4d0 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
1a4e0 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
1a4f0 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
1a500 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
1a510 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
1a520 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
1a530 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
1a540 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
1a550 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
1a560 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
1a570 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
1a580 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
1a590 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
1a5a0 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
1a5b0 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
1a5c0 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
1a5d0 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
1a5e0 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
1a5f0 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
1a600 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
1a610 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
1a620 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
1a630 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
1a640 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a650 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
1a660 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a670 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a680 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1a690 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1a6a0 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
1a6b0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1a6c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a6d0 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
1a6e0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
1a6f0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1a700 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
1a710 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
1a720 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
1a730 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1a740 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1a750 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1a760 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
1a770 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
1a780 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
1a790 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1a7a0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
1a7b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1a7c0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
1a7d0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
1a7e0 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
1a7f0 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
1a800 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1a810 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
1a820 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
1a830 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
1a840 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1a850 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1a860 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1a870 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1a880 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
1a890 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1a8a0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1a8b0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1a8c0 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  CHE.  {.    sqli
1a8d0 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b  te3 *pBlock = 0;
1a8e0 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  .    /* If anoth
1a8f0 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
1a900 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
1a910 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
1a920 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a  ansaction .    *
1a930 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
1a940 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
1a950 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
1a960 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1a970 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  is.    ** reques
1a980 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ted, return SQLI
1a990 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a  TE_LOCKED..    *
1a9a0 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66 6c 61  /.    if( (wrfla
1a9b0 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  g && pBt->inTran
1a9c0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1a9d0 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70  RITE).     || (p
1a9e0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1a9f0 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20  TS_PENDING)!=0. 
1aa00 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f     ){.      pBlo
1aa10 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65  ck = pBt->pWrite
1aa20 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65  r->db;.    }else
1aa30 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
1aa40 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  .      BtLock *p
1aa50 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28  Iter;.      for(
1aa60 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
1aa70 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
1aa80 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
1aa90 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
1aaa0 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
1aab0 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d          pBlock =
1aac0 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
1aad0 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  db;.          br
1aae0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
1aaf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1ab00 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
1ab10 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e       sqlite3Conn
1ab20 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
1ab30 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
1ab40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ab50 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1ab60 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74  HE;.      goto t
1ab70 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20  rans_begun;.    
1ab80 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1ab90 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79  /* Any read-only
1aba0 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65 20 74   or read-write t
1abb0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69  ransaction impli
1abc0 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  es a read-lock o
1abd0 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20  n .  ** page 1. 
1abe0 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  So if some other
1abf0 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c   shared-cache cl
1ac00 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73  ient already has
1ac10 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20   a write-lock . 
1ac20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74   ** on page 1, t
1ac30 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1ac40 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e  annot be opened.
1ac50 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79   */.  rc = query
1ac60 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1ac70 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52  Lock(p, MASTER_R
1ac80 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  OOT, READ_LOCK);
1ac90 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1aca0 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e  !=rc ) goto tran
1acb0 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d  s_begun;..  pBt-
1acc0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1acd0 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1ace0 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  Y;.  if( pBt->nP
1acf0 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74  age==0 ) pBt->bt
1ad00 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e  sFlags |= BTS_IN
1ad10 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1ad20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c   do {.    /* Cal
1ad30 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e  l lockBtree() un
1ad40 74 69 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e  til either pBt->
1ad50 70 50 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61  pPage1 is popula
1ad60 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f  ted or.    ** lo
1ad70 63 6b 42 74 72 65 65 28 29 20 72 65 74 75 72 6e  ckBtree() return
1ad80 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65  s something othe
1ad90 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b  r than SQLITE_OK
1ada0 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20  . lockBtree().  
1adb0 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20    ** may return 
1adc0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1add0 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1ade0 73 65 74 20 74 6f 20 30 20 69 66 20 61 66 74 65  set to 0 if afte
1adf0 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  r.    ** reading
1ae00 20 70 61 67 65 20 31 20 69 74 20 64 69 73 63 6f   page 1 it disco
1ae10 76 65 72 73 20 74 68 61 74 20 74 68 65 20 70 61  vers that the pa
1ae20 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ge-size of the d
1ae30 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
1ae40 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d  file is not pBt-
1ae50 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68  >pageSize. In th
1ae60 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65  is case lockBtre
1ae70 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a  e() will update.
1ae80 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65      ** pBt->page
1ae90 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65  Size to the page
1aea0 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c  -size of the fil
1aeb0 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a  e on disk..    *
1aec0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 42 74  /.    while( pBt
1aed0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53  ->pPage1==0 && S
1aee0 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
1aef0 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29 29 20  lockBtree(pBt)) 
1af00 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  );..    if( rc==
1af10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1af20 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
1af30 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1af40 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1af50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1af60 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1af70 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
1af80 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1af90 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
1afa0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
1afb0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
1afc0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
1afd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1afe0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1aff0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
1b000 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
1b010 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b020 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
1b030 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b040 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
1b050 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1b060 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
1b070 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d  ile( (rc&0xFF)==
1b080 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
1b090 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b0a0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
1b0b0 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
1b0c0 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
1b0d0 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
1b0e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b0f0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
1b100 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
1b110 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
1b120 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23  Transaction++;.#
1b130 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b140 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1b150 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61        if( p->sha
1b160 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  rable ){.       
1b170 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1b180 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d  .pBtree==p && p-
1b190 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20  >lock.iTable==1 
1b1a0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  );.        p->lo
1b1b0 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f  ck.eLock = READ_
1b1c0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d  LOCK;.        p-
1b1d0 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42  >lock.pNext = pB
1b1e0 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  t->pLock;.      
1b1f0 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26    pBt->pLock = &
1b200 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d  p->lock;.      }
1b210 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1b220 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
1b230 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
1b240 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
1b250 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1b260 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
1b270 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
1b280 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1b290 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
1b2a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72      }.    if( wr
1b2b0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65  flag ){.      Me
1b2c0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1b2d0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66  pBt->pPage1;.#if
1b2e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b2f0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1b300 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
1b310 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20  ->pWriter );.   
1b320 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
1b330 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = p;.      pBt->
1b340 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53  btsFlags &= ~BTS
1b350 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
1b360 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29    if( wrflag>1 )
1b370 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1b380 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b  = BTS_EXCLUSIVE;
1b390 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1b3a0 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65  * If the db-size
1b3b0 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 69 73   header field is
1b3c0 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69   incorrect (as i
1b3d0 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f  t may be if an o
1b3e0 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65  ld.      ** clie
1b3f0 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  nt has been writ
1b400 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1b410 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69   file), update i
1b420 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20  t now. Doing.   
1b430 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65     ** this soone
1b440 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61  r rather than la
1b450 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61  ter means the da
1b460 74 61 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20  tabase size can 
1b470 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  safely .      **
1b480 20 72 65 2d 72 65 61 64 20 74 68 65 20 64 61 74   re-read the dat
1b490 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20  abase size from 
1b4a0 70 61 67 65 20 31 20 69 66 20 61 20 73 61 76 65  page 1 if a save
1b4b0 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63  point or transac
1b4c0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f  tion.      ** ro
1b4d0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69  llback occurs wi
1b4e0 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63  thin the transac
1b4f0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1b500 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50       if( pBt->nP
1b510 61 67 65 21 3d 67 65 74 34 62 79 74 65 28 26 70  age!=get4byte(&p
1b520 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1b530 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1b540 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1b550 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
1b560 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1b570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b580 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1b590 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1b5a0 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1b5b0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
1b5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b5d0 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
1b5e0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
1b5f0 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1b600 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ){.    /* This c
1b610 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1b620 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1b630 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1b640 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f  mber of.    ** o
1b650 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
1b660 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  If the second pa
1b670 72 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74  rameter is great
1b680 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20  er than 0 and.  
1b690 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
1b6a0 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65  rnal is not alre
1b6b0 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69  ady open, then i
1b6c0 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  t will be opened
1b6d0 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   here..    */.  
1b6e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b6f0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
1b700 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
1b710 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29  >db->nSavepoint)
1b720 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1b730 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1b740 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1b750 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1b760 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1b770 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1b780 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1b790 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1b7a0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1b7b0 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1b7c0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1b7d0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1b7e0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1b7f0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1b800 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1b810 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1b820 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1b830 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1b840 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1b850 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1b860 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1b870 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1b880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b890 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
1b8a0 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1b8b0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b8e0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1b8f0 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1b900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b920 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1b930 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1b940 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
1b950 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  8 isInitOrig = p
1b960 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
1b970 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
1b980 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
1b990 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1b9a0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
1b9b0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
1b9c0 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67  c = btreeInitPag
1b9d0 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
1b9e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b9f0 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
1ba00 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
1ba10 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
1ba20 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1ba30 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1ba40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
1ba50 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
1ba60 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
1ba70 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
1ba80 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
1ba90 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20 21  &rc);..    if( !
1baa0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1bab0 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50       Pgno childP
1bac0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
1bad0 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74 72  Cell);.      ptr
1bae0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1baf0 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1bb00 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1bb10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1bb20 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1bb30 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
1bb40 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1bb50 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1bb60 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1bb70 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50 75  ]);.    ptrmapPu
1bb80 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
1bb90 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1bba0 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a  pgno, &rc);.  }.
1bbb0 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
1bbc0 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
1bbd0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
1bbe0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
1bbf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
1bc00 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69  where on pPage i
1bc10 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1bc20 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69  age iFrom.  Modi
1bc30 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
1bc40 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  so.** that it po
1bc50 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72  ints to iTo. Par
1bc60 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
1bc70 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
1bc80 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a  of pointer to.**
1bc90 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73   be modified, as
1bca0 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a    follows:.**.**
1bcb0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
1bcc0 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
1bcd0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1bce0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1bcf0 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1bd10 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
1bd20 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1bd30 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
1bd40 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1bd50 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1bd60 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
1bd90 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
1bda0 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
1bdb0 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1bdc0 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
1bdd0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
1bde0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
1bdf0 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
1be00 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
1be10 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
1be20 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
1be30 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1be40 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
1be50 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
1be60 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
1be70 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
1be80 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
1be90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1bea0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1beb0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1bec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
1bed0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
1bee0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66  pDbPage) );.  if
1bef0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1bf00 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20  OVERFLOW2 ){.   
1bf10 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
1bf20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69  is always the fi
1bf30 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74  rst 4 bytes of t
1bf40 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
1bf50 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  case.  */.    if
1bf60 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  ( get4byte(pPage
1bf70 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20  ->aData)!=iFrom 
1bf80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1bf90 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bfa0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
1bfb0 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
1bfc0 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65  Data, iTo);.  }e
1bfd0 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49 6e  lse{.    u8 isIn
1bfe0 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e  itOrig = pPage->
1bff0 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20  isInit;.    int 
1c000 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
1c010 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1c020 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
1c030 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1c040 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1c050 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  n rc;.    nCell 
1c060 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1c070 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c080 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1c090 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
1c0a0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1c0b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
1c0c0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1c0d0 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
1c0e0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
1c0f0 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
1c100 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
1c110 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
1c120 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e         if( info.
1c130 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79  nLocal<info.nPay
1c140 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 26 26  load.         &&
1c150 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a   pCell+info.nSiz
1c160 65 2d 31 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74  e-1<=pPage->aDat
1c170 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67  a+pPage->maskPag
1c180 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 46  e.         && iF
1c190 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43  rom==get4byte(pC
1c1a0 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34  ell+info.nSize-4
1c1b0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
1c1c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1c1d0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1c1e0 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  -4, iTo);.      
1c1f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c200 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1c210 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
1c220 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
1c230 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
1c240 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1c250 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
1c260 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1c270 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c280 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
1c290 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
1c2a0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1c2b0 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
1c2c0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
1c2d0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1c2e0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
1c2f0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1c300 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c310 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c320 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
1c330 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1c340 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1c350 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
1c360 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
1c370 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
1c380 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
1c390 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1c3a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1c3b0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1c3c0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1c3d0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1c3e0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1c3f0 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1c400 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1c410 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1c420 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1c430 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1c440 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1c450 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1c460 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1c470 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1c480 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1c490 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1c4a0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1c4b0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1c4c0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1c4d0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1c4e0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1c4f0 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1c500 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1c510 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1c520 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1c530 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1c540 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1c550 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1c560 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1c570 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1c580 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c590 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1c5a0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1c5b0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1c5c0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1c5d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1c5e0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1c5f0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1c600 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1c610 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1c620 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1c630 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1c640 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1c650 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1c660 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1c670 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1c680 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1c690 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1c6a0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1c6b0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1c6c0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1c6d0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1c6e0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1c6f0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1c700 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c710 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1c720 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1c730 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1c740 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1c750 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1c760 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1c770 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1c780 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1c790 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1c7a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1c7b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1c7c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1c7d0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1c7e0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
1c7f0 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
1c800 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
1c810 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
1c820 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
1c830 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
1c840 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
1c850 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
1c860 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
1c870 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
1c880 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
1c890 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1c8a0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
1c8b0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1c8c0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
1c8d0 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
1c8e0 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
1c8f0 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
1c900 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c910 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1c920 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
1c930 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
1c940 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
1c950 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
1c960 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
1c970 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
1c980 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
1c990 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
1c9a0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
1c9b0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
1c9c0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
1c9d0 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
1c9e0 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
1c9f0 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
1ca00 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
1ca10 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
1ca20 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
1ca30 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
1ca40 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
1ca50 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
1ca60 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1ca70 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
1ca80 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
1ca90 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
1caa0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
1cab0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
1cac0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1cad0 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
1cae0 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1caf0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1cb00 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1cb10 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
1cb20 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
1cb30 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1cb40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1cb50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1cb60 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
1cb70 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
1cb80 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
1cb90 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
1cba0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
1cbb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  =0 ){.      ptrm
1cbc0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
1cbd0 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
1cbe0 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
1cbf0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66  , &rc);.      if
1cc00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cc10 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1cc20 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1cc30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
1cc40 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
1cc50 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
1cc60 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
1cc70 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
1cc80 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
1cc90 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
1cca0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
1ccb0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1ccc0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
1ccd0 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
1cce0 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
1ccf0 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1cd00 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1cd10 65 28 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c  e(pBt, iPtrPage,
1cd20 20 26 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a   &pPtrPage, 0);.
1cd30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cd40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1cd50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1cd60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1cd70 50 61 67 65 72 57 72 69 74 65 28 70 50 74 72 50  PagerWrite(pPtrP
1cd80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1cd90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cda0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1cdb0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1cdc0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
1cdd0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1cde0 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50  rc = modifyPageP
1cdf0 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c  ointer(pPtrPage,
1ce00 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1ce10 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20  age, eType);.   
1ce20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1ce30 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1ce40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ce50 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1ce60 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
1ce70 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
1ce80 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20  , &rc);.    }.  
1ce90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1cea0 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
1ceb0 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
1cec0 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
1ced0 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
1cee0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
1cef0 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
1cf00 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
1cf10 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
1cf20 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
1cf30 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
1cf40 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
1cf50 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
1cf60 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a  essful, return.*
1cf70 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  * SQLITE_OK. If 
1cf80 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
1cf90 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
1cfa0 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69  efore no point i
1cfb0 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  n .** calling th
1cfc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69  is function agai
1cfd0 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  n), return SQLIT
1cfe0 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61  E_DONE. Or, if a
1cff0 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75  n error .** occu
1d000 72 73 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20  rs, return some 
1d010 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
1d020 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
1d030 63 69 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20  cifically, this 
1d040 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
1d050 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
1d060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 6f   the database so
1d070 20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61   .** that the la
1d080 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
1d090 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
1d0a0 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   use is no longe
1d0b0 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
1d0c0 50 61 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69  Parameter nFin i
1d0d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d0e0 70 61 67 65 73 20 74 68 61 74 20 74 68 69 73 20  pages that this 
1d0f0 64 61 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63  database would c
1d100 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74  ontain.** were t
1d110 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  his function cal
1d120 6c 65 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74  led until it ret
1d130 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
1d140 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
1d150 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72  Commit parameter
1d160 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1d170 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
1d180 6d 65 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  mes that the .**
1d190 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65   caller will kee
1d1a0 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61  p calling incrVa
1d1b0 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c  cuumStep() until
1d1c0 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
1d1d0 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61  TE_DONE .** or a
1d1e0 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74  n error. bCommit
1d1f0 20 69 73 20 70 61 73 73 65 64 20 74 72 75 65 20   is passed true 
1d200 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1d210 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a  um-on-commit .**
1d220 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66   operation, or f
1d230 61 6c 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72  alse for an incr
1d240 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
1d250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
1d260 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
1d270 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1d280 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73   nFin, Pgno iLas
1d290 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74  tPg, int bCommit
1d2a0 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c  ){.  Pgno nFreeL
1d2b0 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ist;           /
1d2c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1d2d0 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66  s still on the f
1d2e0 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ree-list */.  in
1d2f0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1d300 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d310 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1d320 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61  );.  assert( iLa
1d330 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20  stPg>nFin );..  
1d340 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
1d350 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
1d360 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
1d370 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1d380 42 74 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54  Bt) ){.    u8 eT
1d390 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50  ype;.    Pgno iP
1d3a0 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72  trPage;..    nFr
1d3b0 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74  eeList = get4byt
1d3c0 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1d3d0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1d3e0 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30  if( nFreeList==0
1d3f0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d400 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1d410 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74    }..    rc = pt
1d420 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61  rmapGet(pBt, iLa
1d430 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69  stPg, &eType, &i
1d440 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
1d450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d460 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d470 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1d480 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d490 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
1d4a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d4b0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1d4c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79    }..    if( eTy
1d4d0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1d4e0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  AGE ){.      if(
1d4f0 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1d500 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
1d510 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
1d520 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
1d530 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
1d540 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
1d550 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69   ** if bCommit i
1d560 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
1d570 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
1d580 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
1d590 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
1d5a0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
1d5b0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1d5c0 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
1d5d0 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
1d5e0 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
1d5f0 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
1d600 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
1d610 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
1d620 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
1d630 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
1d640 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
1d650 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
1d660 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d670 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
1d680 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
1d690 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29  , BTALLOC_EXACT)
1d6a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d6b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d6c0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d6d0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1d6e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1d6f0 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29  reePg==iLastPg )
1d700 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
1d710 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a  ePage(pFreePg);.
1d720 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
1d730 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  se {.      Pgno 
1d740 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20  iFreePg;        
1d750 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1d760 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f   free page to mo
1d770 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f  ve pLastPg to */
1d780 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1d790 70 4c 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75  pLastPg;.      u
1d7a0 38 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f  8 eMode = BTALLO
1d7b0 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65  C_ANY;   /* Mode
1d7c0 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
1d7d0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1d7e0 28 29 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f  () */.      Pgno
1d7f0 20 69 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20   iNear = 0;     
1d800 20 20 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20        /* nearby 
1d810 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c  parameter for al
1d820 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
1d830 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d  ) */..      rc =
1d840 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
1d850 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
1d860 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
1d870 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d880 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1d890 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1d8a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f  .      /* If bCo
1d8b0 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68  mmit is zero, th
1d8c0 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61  is loop runs exa
1d8d0 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61  ctly once and pa
1d8e0 67 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20  ge pLastPg.     
1d8f0 20 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77   ** is swapped w
1d900 69 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72  ith the first fr
1d910 65 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f  ee page pulled o
1d920 66 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  ff the free list
1d930 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1d940 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72   ** On the other
1d950 20 68 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69   hand, if bCommi
1d960 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
1d970 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
1d980 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
1d990 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
1d9a0 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
1d9b0 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
1d9c0 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
1d9d0 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
1d9e0 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
1d9f0 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1da00 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1da10 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43   eMode = BTALLOC
1da20 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  _LE;.        iNe
1da30 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20  ar = nFin;.     
1da40 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20   }.      do {.  
1da50 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
1da60 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
1da70 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
1da80 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
1da90 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
1daa0 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20  iNear, eMode);. 
1dab0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1dac0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dad0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1dae0 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
1daf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1db00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1db10 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1db20 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
1db30 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26  while( bCommit &
1db40 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
1db50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1db60 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
1db70 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
1db80 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
1db90 65 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20  e(pBt, pLastPg, 
1dba0 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c  eType, iPtrPage,
1dbb0 20 69 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69   iFreePg, bCommi
1dbc0 74 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  t);.      releas
1dbd0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1dbe0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1dbf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1dc00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1dc10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1dc20 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d  .  if( bCommit==
1dc30 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  0 ){.    do {.  
1dc40 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
1dc50 20 20 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74     }while( iLast
1dc60 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
1dc70 5f 50 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54  _PAGE(pBt) || PT
1dc80 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1dc90 20 69 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20   iLastPg) );.   
1dca0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
1dcb0 65 20 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e  e = 1;.    pBt->
1dcc0 6e 50 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b  nPage = iLastPg;
1dcd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1dce0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1dcf0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f  * The database o
1dd00 70 65 6e 65 64 20 62 79 20 74 68 65 20 66 69 72  pened by the fir
1dd10 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1dd20 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
1dd30 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20  tabase.** nOrig 
1dd40 70 61 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f  pages in size co
1dd50 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66  ntaining nFree f
1dd60 72 65 65 20 70 61 67 65 73 2e 20 52 65 74 75 72  ree pages. Retur
1dd70 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a  n the expected .
1dd80 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  ** size of the d
1dd90 61 74 61 62 61 73 65 20 69 6e 20 70 61 67 65 73  atabase in pages
1dda0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75   following an au
1ddb0 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74  to-vacuum operat
1ddc0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  ion..*/.static P
1ddd0 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  gno finalDbSize(
1dde0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1ddf0 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20  gno nOrig, Pgno 
1de00 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45  nFree){.  int nE
1de10 6e 74 72 79 3b 20 20 20 20 20 20 20 20 20 20 20  ntry;           
1de20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1de30 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f  ber of entries o
1de40 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67  n one ptrmap pag
1de50 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72  e */.  Pgno nPtr
1de60 6d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  map;            
1de70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1de80 20 6f 66 20 50 74 72 4d 61 70 20 70 61 67 65 73   of PtrMap pages
1de90 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1dea0 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20    Pgno nFin;    
1deb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dec0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1ded0 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d  e */..  nEntry =
1dee0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1def0 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20  /5;.  nPtrmap = 
1df00 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52  (nFree-nOrig+PTR
1df10 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
1df20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e  nOrig)+nEntry)/n
1df30 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20  Entry;.  nFin = 
1df40 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20  nOrig - nFree - 
1df50 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e  nPtrmap;.  if( n
1df60 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54  Orig>PENDING_BYT
1df70 45 5f 50 41 47 45 28 70 42 74 29 20 26 26 20 6e  E_PAGE(pBt) && n
1df80 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45  Fin<PENDING_BYTE
1df90 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1dfa0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20    nFin--;.  }.  
1dfb0 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
1dfc0 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20  PAGE(pBt, nFin) 
1dfd0 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47  || nFin==PENDING
1dfe0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1dff0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1e000 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69   }..  return nFi
1e010 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  n;.}../*.** A wr
1e020 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1e030 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
1e040 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
1e050 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
1e060 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
1e070 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
1e080 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
1e090 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
1e0a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
1e0b0 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
1e0c0 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
1e0d0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
1e0e0 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
1e0f0 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
1e100 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
1e110 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
1e120 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
1e130 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
1e140 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
1e150 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
1e160 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
1e170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1e180 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
1e190 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1e1a0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
1e1b0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
1e1c0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1e1d0 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
1e1e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1e1f0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
1e200 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
1e210 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
1e220 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
1e230 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
1e240 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
1e250 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1e260 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1e270 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1e280 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74  Pgno nFree = get
1e290 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e2a0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1e2b0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
1e2c0 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1e2d0 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1e2e0 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e  .    if( nOrig<n
1e2f0 46 69 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Fin ){.      rc 
1e300 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1e310 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1e320 20 69 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a   if( nFree>0 ){.
1e330 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41        rc = saveA
1e340 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
1e350 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1e360 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e370 0a 20 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64  .        invalid
1e380 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1e390 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  che(pBt);.      
1e3a0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
1e3b0 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
1e3c0 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20   nOrig, 0);.    
1e3d0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
1e3e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e3f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e400 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1e410 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1e420 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ge);.        put
1e430 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1e440 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1e450 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1e460 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1e470 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e480 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
1e490 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1e4a0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1e4b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1e4c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1e4d0 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
1e4e0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
1e4f0 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
1e500 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
1e510 74 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f  tted for an auto
1e520 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1e530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
1e540 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e550 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20  , then *pnTrunc 
1e560 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
1e570 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
1e580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1e590 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  le should be tru
1e5a0 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67  ncated to during
1e5b0 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63   the commit proc
1e5c0 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68  ess. .** i.e. th
1e5d0 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1e5e0 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20  een reorganized 
1e5f0 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65  so that only the
1e600 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a   first *pnTrunc.
1e610 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20  ** pages are in 
1e620 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  use..*/.static i
1e630 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d  nt autoVacuumCom
1e640 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  mit(BtShared *pB
1e650 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
1e660 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1e670 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1e680 3e 70 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f  >pPager;.  VVA_O
1e690 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20  NLY( int nRef = 
1e6a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1e6b0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a  ount(pPager); ).
1e6c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1e6d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1e6e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1e6f0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
1e700 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
1e710 20 20 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75    assert(pBt->au
1e720 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28  toVacuum);.  if(
1e730 20 21 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75   !pBt->incrVacuu
1e740 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  m ){.    Pgno nF
1e750 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  in;         /* N
1e760 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1e770 6e 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  n database after
1e780 20 61 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a   autovacuuming *
1e790 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65  /.    Pgno nFree
1e7a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ;        /* Numb
1e7b0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1e7c0 68 65 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74  he freelist init
1e7d0 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e  ially */.    Pgn
1e7e0 6f 20 69 46 72 65 65 3b 20 20 20 20 20 20 20 20  o iFree;        
1e7f0 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 61 67 65  /* The next page
1e800 20 74 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a   to be freed */.
1e810 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20      Pgno nOrig; 
1e820 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1e830 73 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66  se size before f
1e840 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e  reeing */..    n
1e850 4f 72 69 67 20 3d 20 62 74 72 65 65 50 61 67 65  Orig = btreePage
1e860 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20  count(pBt);.    
1e870 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
1e880 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
1e890 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
1e8a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1e8b0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
1e8c0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
1e8d0 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
1e8e0 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
1e8f0 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
1e900 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
1e910 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
1e920 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
1e930 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
1e940 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
1e950 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
1e960 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
1e970 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
1e980 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e990 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e9a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
1e9b0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1e9c0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1e9d0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e  a[36]);.    nFin
1e9e0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1e9f0 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1ea00 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e  );.    if( nFin>
1ea10 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20 53  nOrig ) return S
1ea20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ea30 50 54 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e  PT;.    if( nFin
1ea40 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  <nOrig ){.      
1ea50 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1ea60 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1ea70 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46      }.    for(iF
1ea80 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
1ea90 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
1eaa0 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
1eab0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
1eac0 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
1ead0 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29   nFin, iFree, 1)
1eae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1eaf0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc==SQLITE_DONE
1eb00 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   || rc==SQLITE_O
1eb10 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b  K) && nFree>0 ){
1eb20 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1eb30 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
1eb40 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
1eb50 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
1eb60 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1eb70 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
1eb80 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1eb90 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1eba0 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
1ebb0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
1ebc0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1ebd0 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20  28], nFin);.    
1ebe0 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61    pBt->bDoTrunca
1ebf0 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42  te = 1;.      pB
1ec00 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b  t->nPage = nFin;
1ec10 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1ec20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ec30 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
1ec40 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
1ec50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
1ec60 20 61 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73   assert( nRef>=s
1ec70 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
1ec80 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
1ec90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1eca0 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
1ecb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1ecc0 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
1ecd0 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
1ece0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
1ecf0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1ed00 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
1ed10 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
1ed20 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
1ed30 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
1ed40 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
1ed50 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ed60 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
1ed70 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
1ed80 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
1ed90 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
1eda0 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
1edb0 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
1edc0 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
1edd0 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
1ede0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
1edf0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
1ee00 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
1ee10 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
1ee20 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
1ee30 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
1ee40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
1ee50 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
1ee60 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
1ee70 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
1ee80 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
1ee90 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
1eea0 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
1eeb0 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
1eec0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
1eed0 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
1eee0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
1eef0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
1ef00 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
1ef10 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
1ef20 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
1ef30 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
1ef40 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
1ef50 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
1ef60 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1ef70 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
1ef80 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
1ef90 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1efa0 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
1efb0 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
1efc0 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
1efd0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
1efe0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
1eff0 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
1f000 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
1f010 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
1f020 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
1f030 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
1f040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1f050 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
1f060 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
1f070 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
1f080 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
1f090 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
1f0a0 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
1f0b0 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
1f0c0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
1f0d0 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
1f0e0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
1f0f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1f100 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
1f110 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
1f120 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
1f130 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
1f140 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
1f150 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
1f160 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
1f170 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
1f180 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
1f190 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
1f1a0 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1f1b0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
1f1c0 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
1f1d0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
1f1e0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
1f1f0 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
1f200 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
1f210 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
1f220 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
1f230 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
1f240 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
1f250 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f260 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
1f270 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1f280 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
1f290 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f2a0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1f2b0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1f2c0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
1f2d0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
1f2e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1f2f0 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
1f300 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f310 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
1f320 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1f330 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
1f340 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
1f350 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1f360 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f370 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f380 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
1f390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f3a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1f3b0 66 28 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  f( pBt->bDoTrunc
1f3c0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ate ){.      sql
1f3d0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1f3e0 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
1f3f0 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  er, pBt->nPage);
1f400 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1f410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f420 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
1f430 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a  e(pBt->pPager, z
1f440 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
1f450 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1f460 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
1f470 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f480 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1f490 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74   called from bot
1f4a0 68 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  h BtreeCommitPha
1f4b0 73 65 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65  seTwo() and Btre
1f4c0 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61  eRollback().** a
1f4d0 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
1f4e0 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
1f4f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1f500 64 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61  d btreeEndTransa
1f510 63 74 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b  ction(Btree *p){
1f520 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1f530 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c   = p->pBt;.  sql
1f540 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
1f550 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1f560 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
1f570 65 78 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65  ex(p) );..#ifnde
1f580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1f590 54 4f 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e  TOVACUUM.  pBt->
1f5a0 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b  bDoTruncate = 0;
1f5b0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
1f5c0 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1f5d0 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65  ONE && db->nVdbe
1f5e0 52 65 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  Read>1 ){.    /*
1f5f0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 74   If there are ot
1f600 68 65 72 20 61 63 74 69 76 65 20 73 74 61 74 65  her active state
1f610 6d 65 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e  ments that belon
1f620 67 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  g to this databa
1f630 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65  se.    ** handle
1f640 2c 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61  , downgrade to a
1f650 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73   read-only trans
1f660 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65  action. The othe
1f670 72 20 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20  r statements.   
1f680 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65   ** may still be
1f690 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68   reading from th
1f6a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a  e database.  */.
1f6b0 20 20 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c      downgradeAll
1f6c0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1f6d0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d  Locks(p);.    p-
1f6e0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f6f0 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1f700 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61      /* If the ha
1f710 6e 64 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e  ndle had any kin
1f720 64 20 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e  d of transaction
1f730 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74   open, decrement
1f740 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61   the .    ** tra
1f750 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f  nsaction count o
1f760 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
1f770 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
1f780 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20  action count .  
1f790 20 20 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20    ** reaches 0, 
1f7a0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
1f7b0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f  tate to TRANS_NO
1f7c0 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74  NE. The unlockBt
1f7d0 72 65 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20  reeIfUnused().  
1f7e0 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20    ** call below 
1f7f0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
1f800 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69  pager.  */.    i
1f810 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  f( p->inTrans!=T
1f820 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1f830 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65     clearAllShare
1f840 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1f850 28 70 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  (p);.      pBt->
1f860 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
1f870 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74        if( 0==pBt
1f880 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
1f890 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  {.        pBt->i
1f8a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
1f8b0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20  RANS_NONE;.     
1f8c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1f8d0 20 53 65 74 20 74 68 65 20 63 75 72 72 65 6e 74   Set the current
1f8e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
1f8f0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
1f900 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
1f910 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66  .    ** pager if
1f920 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
1f930 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
1f940 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
1f950 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d  tion.  */.    p-
1f960 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
1f970 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63  _NONE;.    unloc
1f980 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1f990 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
1f9a0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d  eIntegrity(p);.}
1f9b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74  ../*.** Commit t
1f9c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
1f9d0 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
1f9e0 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ress..**.** This
1f9f0 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
1fa00 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70  nts the second p
1fa10 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73  hase of a 2-phas
1fa20 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a  e commit.  The.*
1fa30 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1fa40 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72  mmitPhaseOne() r
1fa50 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1fa60 66 69 72 73 74 20 70 68 61 73 65 20 61 6e 64 20  first phase and 
1fa70 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76  should.** be inv
1fa80 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61  oked prior to ca
1fa90 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1faa0 6e 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ne.  The sqlite3
1fab0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1fac0 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  One().** routine
1fad0 20 64 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72   did all the wor
1fae0 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
1faf0 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
1fb00 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
1fb10 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
1fb20 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
1fb30 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
1fb40 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
1fb50 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
1fb60 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
1fb70 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
1fb80 75 6e 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74  uncate or zero t
1fb90 68 65 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  he header in the
1fba0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
1fbb0 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20   journal (which 
1fbc0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
1fbd0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
1fbe0 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f  ) and.** drop lo
1fbf0 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61  cks..**.** Norma
1fc00 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72  lly, if an error
1fc10 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
1fc20 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69 73  e pager layer is
1fc30 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a   attempting to .
1fc40 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20  ** finalize the 
1fc50 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e  underlying journ
1fc60 61 6c 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75  al file, this fu
1fc70 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
1fc80 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74  n error and.** t
1fc90 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 77  he upper layer w
1fca0 69 6c 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f  ill attempt a ro
1fcb0 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c  llback. However,
1fcc0 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1fcd0 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f  rgument.** is no
1fce0 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73  n-zero then this
1fcf0 20 62 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74   b-tree transact
1fd00 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61  ion is part of a
1fd10 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20   multi-file .** 
1fd20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20  transaction. In 
1fd30 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20 74  this case, the t
1fd40 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61  ransaction has a
1fd50 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d  lready been comm
1fd60 69 74 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65  itted .** (by de
1fd70 6c 65 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20  leting a master 
1fd80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e  journal file) an
1fd90 64 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  d the caller wil
1fda0 6c 20 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a  l ignore this .*
1fdb0 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  * functions retu
1fdc0 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65  rn code. So, eve
1fdd0 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  n if an error oc
1fde0 63 75 72 73 20 69 6e 20 74 68 65 20 70 61 67 65  curs in the page
1fdf0 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65  r layer,.** rese
1fe00 74 20 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a  t the b-tree obj
1fe10 65 63 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74  ects internal st
1fe20 61 74 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ate to indicate 
1fe30 74 68 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a  that the write.*
1fe40 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  * transaction ha
1fe50 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54  s been closed. T
1fe60 68 69 73 20 69 73 20 71 75 69 74 65 20 73 61 66  his is quite saf
1fe70 65 2c 20 61 73 20 74 68 65 20 70 61 67 65 72 20  e, as the pager 
1fe80 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61  will have.** tra
1fe90 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65  nsitioned to the
1fea0 20 65 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a   error state..**
1feb0 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65  .** This will re
1fec0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1fed0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1fee0 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74  base file.  If t
1fef0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61  here.** are no a
1ff00 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69  ctive cursors, i
1ff10 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20  t also releases 
1ff20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
1ff30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1ff40 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1ff50 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62  (Btree *p, int b
1ff60 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28  Cleanup){..  if(
1ff70 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ff80 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e  NS_NONE ) return
1ff90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
1ffa0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1ffb0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1ffc0 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1ffd0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
1ffe0 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1fff0 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69  tion open, commi
20000 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  t the shared-btr
20010 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ees .  ** transa
20020 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68  ction and set th
20030 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
20040 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20  o TRANS_READ..  
20050 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
20060 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
20070 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
20080 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
20090 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20  t = p->pBt;.    
200a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
200b0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
200c0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61  S_WRITE );.    a
200d0 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
200e0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
200f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20100 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
20110 6f 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  o(pBt->pPager);.
20120 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20130 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75  TE_OK && bCleanu
20140 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
20150 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20160 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
20170 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
20180 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d  ->iDataVersion--
20190 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65  ;  /* Compensate
201a0 20 66 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61   for pPager->iDa
201b0 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a  taVersion++; */.
201c0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
201d0 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
201e0 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
201f0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
20200 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
20210 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
20220 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
20230 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
20240 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20250 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20  ../*.** Do both 
20260 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d  phases of a comm
20270 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  it..*/.int sqlit
20280 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74  e3BtreeCommit(Bt
20290 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
202a0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
202b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
202c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
202d0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20  mmitPhaseOne(p, 
202e0 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  0);.  if( rc==SQ
202f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
20300 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
20310 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
20320 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
20330 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20340 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20350 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
20360 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74  tine sets the st
20370 61 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ate to CURSOR_FA
20380 55 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f  ULT and the erro
20390 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72  r.** code to err
203a0 43 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63  Code for every c
203b0 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53  ursor on any BtS
203c0 68 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65  hared that pBtre
203d0 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e  e.** references.
203e0 20 20 4f 72 20 69 66 20 74 68 65 20 77 72 69 74    Or if the writ
203f0 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65  eOnly flag is se
20400 74 20 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c  t to 1, then onl
20410 79 0a 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20  y.** trip write 
20420 63 75 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76  cursors and leav
20430 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 75  e read cursors u
20440 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
20450 45 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20  Every cursor is 
20460 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62  a candidate to b
20470 65 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  e tripped, inclu
20480 64 69 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20  ding cursors.** 
20490 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f  that belong to o
204a0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
204b0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
204c0 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73  appen to be.** s
204d0 68 61 72 69 6e 67 20 74 68 65 20 63 61 63 68 65  haring the cache
204e0 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
204f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20500 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
20510 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
20520 75 72 73 2e 20 49 66 20 74 68 65 20 77 72 69 74  urs. If the writ
20530 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73  eOnly.** flag is
20540 20 74 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79   true, then only
20550 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e   write-cursors n
20560 65 65 64 20 62 65 20 74 72 69 70 70 65 64 20 2d  eed be tripped -
20570 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75   read-only.** cu
20580 72 73 6f 72 73 20 73 61 76 65 20 74 68 65 69 72  rsors save their
20590 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
205a0 6e 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ns so that they 
205b0 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a  may continue .**
205c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72   following the r
205d0 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20  ollback. Or, if 
205e0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
205f0 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  se, all cursors 
20600 61 72 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e  are .** tripped.
20610 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69   In general, wri
20620 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20  teOnly is false 
20630 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
20640 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c  on being.** roll
20650 65 64 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64  ed back modified
20660 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
20670 68 65 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61  hema. In this ca
20680 73 65 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a  se b-tree root.*
20690 2a 20 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d  * pages may be m
206a0 6f 76 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20  oved or deleted 
206b0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
206c0 65 20 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61  e altogether, ma
206d0 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66  king.** it unsaf
206e0 65 20 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f  e for read curso
206f0 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a  rs to continue..
20700 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69  **.** If the wri
20710 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74  teOnly flag is t
20720 72 75 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  rue and an error
20730 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   is encountered 
20740 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67  while .** saving
20750 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
20760 69 74 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d  ition of a read-
20770 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c  only cursor, all
20780 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e   cursors, .** in
20790 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64  cluding all read
207a0 2d 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69  -cursors are tri
207b0 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  pped..**.** SQLI
207c0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
207d0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  d if successful,
207e0 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20   or if an error 
207f0 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20  occurs while.** 
20800 73 61 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20  saving a cursor 
20810 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c  position, an SQL
20820 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
20830 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20840 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
20850 73 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c  s(Btree *pBtree,
20860 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e   int errCode, in
20870 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
20880 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69  BtCursor *p;.  i
20890 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
208a0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77  K;..  assert( (w
208b0 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77  riteOnly==0 || w
208c0 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20  riteOnly==1) && 
208d0 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d  BTCF_WriteFlag==
208e0 31 20 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65  1 );.  if( pBtre
208f0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
20900 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
20910 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42  e);.    for(p=pB
20920 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
20930 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
20940 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  t){.      int i;
20950 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65  .      if( write
20960 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72 46  Only && (p->curF
20970 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74  lags & BTCF_Writ
20980 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20  eFlag)==0 ){.   
20990 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61       if( p->eSta
209a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
209b0 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43   || p->eState==C
209c0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
209d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
209e0 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
209f0 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
20a00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20a10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
20a20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33     (void)sqlite3
20a30 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
20a40 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c 20  ors(pBtree, rc, 
20a50 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
20a60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20a70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
20a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20a90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
20aa0 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  earCursor(p);.  
20ab0 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20        p->eState 
20ac0 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a  = CURSOR_FAULT;.
20ad0 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e          p->skipN
20ae0 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20  ext = errCode;. 
20af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
20b00 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67  (i=0; i<=p->iPag
20b10 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  e; i++){.       
20b20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 2d 3e   releasePage(p->
20b30 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
20b40 20 20 20 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d      p->apPage[i]
20b50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
20b60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
20b70 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
20b80 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20b90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
20ba0 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61  lback the transa
20bb0 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
20bc0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70  s..**.** If trip
20bd0 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49  Code is not SQLI
20be0 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f  TE_OK then curso
20bf0 72 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c  rs will be inval
20c00 69 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29  idated (tripped)
20c10 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  ..** Only write 
20c20 63 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70  cursors are trip
20c30 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79  ped if writeOnly
20c40 20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c   is true but all
20c50 20 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20   cursors are.** 
20c60 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
20c70 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20  Only is false.  
20c80 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75  Any attempt to u
20c90 73 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20  se.** a tripped 
20ca0 63 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75  cursor will resu
20cb0 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a  lt in an error..
20cc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  **.** This will 
20cd0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
20ce0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
20cf0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
20d00 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
20d10 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c   active cursors,
20d20 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65   it also release
20d30 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  s the read lock.
20d40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
20d50 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72  treeRollback(Btr
20d60 65 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43  ee *p, int tripC
20d70 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e  ode, int writeOn
20d80 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ly){.  int rc;. 
20d90 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
20da0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
20db0 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61  ge *pPage1;..  a
20dc0 73 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79  ssert( writeOnly
20dd0 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==1 || writeOnly
20de0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
20df0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
20e00 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
20e10 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51   || tripCode==SQ
20e20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c  LITE_OK );.  sql
20e30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20e40 29 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64  );.  if( tripCod
20e50 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  e==SQLITE_OK ){.
20e60 20 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64      rc = tripCod
20e70 65 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  e = saveAllCurso
20e80 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20  rs(pBt, 0, 0);. 
20e90 20 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74     if( rc ) writ
20ea0 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c  eOnly = 0;.  }el
20eb0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
20ec0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
20ed0 28 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20  ( tripCode ){.  
20ee0 20 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69    int rc2 = sqli
20ef0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
20f00 75 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f  ursors(p, tripCo
20f10 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a  de, writeOnly);.
20f20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
20f30 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72  SQLITE_OK || (wr
20f40 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63  iteOnly==0 && rc
20f50 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b  2==SQLITE_OK) );
20f60 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
20f70 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
20f80 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49  c2;.  }.  btreeI
20f90 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
20fa0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
20fb0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
20fc0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
20fd0 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
20fe0 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
20ff0 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
21000 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
21010 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
21020 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
21030 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
21040 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
21050 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
21060 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
21070 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
21080 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
21090 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
210a0 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47    ** call btreeG
210b0 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
210c0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
210d0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
210e0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
210f0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
21100 20 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74      if( btreeGet
21110 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
21120 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
21130 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
21140 20 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   nPage = get4byt
21150 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31  e(28+(u8*)pPage1
21160 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->aData);.      
21170 74 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d  testcase( nPage=
21180 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
21190 6e 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74  nPage==0 ) sqlit
211a0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
211b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
211c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73  Page);.      tes
211d0 74 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67  tcase( pBt->nPag
211e0 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  e!=nPage );.    
211f0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
21200 50 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65  Page;.      rele
21210 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
21220 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
21230 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  t( countValidCur
21240 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20  sors(pBt, 1)==0 
21250 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  );.    pBt->inTr
21260 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
21270 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
21280 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
21290 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
212a0 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
212b0 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
212c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
212d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
212e0 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61 74  .** Start a stat
212f0 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
21300 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
21310 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20  nsaction can be 
21320 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69  rolled.** back i
21330 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20  ndependently of 
21340 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
21350 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73  tion. You must s
21360 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69  tart a transacti
21370 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74  on .** before st
21380 61 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e  arting a subtran
21390 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
213a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
213b0 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  nded automatical
213c0 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61  ly .** if the ma
213d0 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  in transaction c
213e0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
213f0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  back..**.** Stat
21400 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
21410 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
21420 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
21430 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
21440 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
21450 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
21460 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
21470 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
21480 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
21490 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
214a0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
214b0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
214c0 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
214d0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
214e0 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
214f0 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
21500 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
21510 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74  tion..**.** A st
21520 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e  atement sub-tran
21530 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  saction is imple
21540 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f  mented as an ano
21550 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
21560 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70  . The.** value p
21570 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
21580 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
21590 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
215a0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c  r of savepoints,
215b0 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  .** including th
215c0 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20  e new anonymous 
215d0 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20  savepoint, open 
215e0 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69  on the B-Tree. i
215f0 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  .e. if there.** 
21600 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61  are no active sa
21610 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20  vepoints and no 
21620 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d  other statement-
21630 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
21640 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74  n,.** iStatement
21650 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e   is 1. This anon
21660 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20  ymous savepoint 
21670 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
21680 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a  or rolled back.*
21690 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69  * using the sqli
216a0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
216b0 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  t() function..*/
216c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
216d0 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65  eBeginStmt(Btree
216e0 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d   *p, int iStatem
216f0 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ent){.  int rc;.
21700 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
21710 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
21720 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
21730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
21740 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21750 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
21760 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21770 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
21780 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
21790 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
217a0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
217b0 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
217c0 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73  vepoint );.  ass
217d0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
217e0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
217f0 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20  RITE );.  /* At 
21800 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
21810 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
21820 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
21830 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a  vepoint with.  *
21840 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74  * an index great
21850 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65  er than all save
21860 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64 20 65  points created e
21870 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a  xplicitly using.
21880 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    ** SQL stateme
21890 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67  nts. It is illeg
218a0 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65  al to open, rele
218b0 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
218c0 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61  any.  ** such sa
218d0 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74  vepoints while t
218e0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
218f0 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69  nsaction savepoi
21900 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20  nt is active..  
21910 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
21920 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
21930 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
21940 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20   iStatement);.  
21950 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
21960 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
21970 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
21980 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
21990 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
219a0 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20  , op, is always 
219b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
219c0 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49  CK.** or SAVEPOI
219d0 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73  NT_RELEASE. This
219e0 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72   function either
219f0 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c   releases or rol
21a00 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73  ls back the.** s
21a10 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66  avepoint identif
21a20 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
21a30 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70   iSavepoint, dep
21a40 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61  ending on the va
21a50 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a  lue .** of op..*
21a60 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
21a70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
21a80 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
21a90 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65  al to zero. Howe
21aa0 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a  ver, if op is.**
21ab0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
21ac0 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70  ACK, then iSavep
21ad0 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65  oint may also be
21ae0 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73   -1. In this cas
21af0 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  e the .** conten
21b00 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  ts of the entire
21b10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65   transaction are
21b20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
21b30 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
21b40 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c  ** from a normal
21b50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c   transaction rol
21b60 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63  lback, as no loc
21b70 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65 64 20  ks are released 
21b80 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73  and the.** trans
21b90 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f  action remains o
21ba0 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pen..*/.int sqli
21bb0 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e  te3BtreeSavepoin
21bc0 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
21bd0 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69  op, int iSavepoi
21be0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nt){.  int rc = 
21bf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
21c00 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73   p && p->inTrans
21c10 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
21c20 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
21c30 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20  Bt = p->pBt;.   
21c40 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56   assert( op==SAV
21c50 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c  EPOINT_RELEASE |
21c60 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  | op==SAVEPOINT_
21c70 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20  ROLLBACK );.    
21c80 61 73 73 65 72 74 28 20 69 53 61 76 65 70 6f 69  assert( iSavepoi
21c90 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70  nt>=0 || (iSavep
21ca0 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d  oint==-1 && op==
21cb0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
21cc0 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  CK) );.    sqlit
21cd0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
21ce0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21cf0 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
21d00 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
21d10 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
21d20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21d30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
21d40 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26 26   iSavepoint<0 &&
21d50 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
21d60 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f  & BTS_INITIALLY_
21d70 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20 20  EMPTY)!=0 ){.   
21d80 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
21d90 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
21da0 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
21db0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
21dc0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74  pBt->nPage = get
21dd0 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d 3e  4byte(28 + pBt->
21de0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
21df0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61  .      /* The da
21e00 74 61 62 61 73 65 20 73 69 7a 65 20 77 61 73 20  tabase size was 
21e10 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
21e20 20 6f 66 66 73 65 74 20 32 38 20 6f 66 20 74 68   offset 28 of th
21e30 65 20 68 65 61 64 65 72 0a 20 20 20 20 20 20 2a  e header.      *
21e40 2a 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  * when the trans
21e50 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 2c 20  action started, 
21e60 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  so we know that 
21e70 74 68 65 20 76 61 6c 75 65 20 61 74 20 6f 66 66  the value at off
21e80 73 65 74 0a 20 20 20 20 20 20 2a 2a 20 32 38 20  set.      ** 28 
21e90 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20  is nonzero. */. 
21ea0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
21eb0 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->nPage>0 );.   
21ec0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
21ed0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
21ee0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21ef0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
21f00 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
21f10 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
21f20 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
21f30 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
21f40 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21f50 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
21f60 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
21f70 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
21f80 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
21f90 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
21fa0 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
21fb0 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
21fc0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
21fd0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
21fe0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
21ff0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
22000 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
22010 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
22020 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22030 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
22040 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
22050 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
22060 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
22070 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
22080 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
22090 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
220a0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
220b0 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
220c0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
220d0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
220e0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
220f0 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
22100 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
22110 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
22120 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
22130 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
22140 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
22150 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
22160 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
22170 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
22180 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
22190 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
221a0 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
221b0 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
221c0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
221d0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
221e0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
221f0 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
22200 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
22210 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
22220 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
22230 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
22240 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
22250 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
22260 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
22270 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
22280 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
22290 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
222a0 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
222b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
222c0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
222d0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
222e0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
222f0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
22300 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
22310 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
22320 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
22330 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
22340 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
22350 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
22360 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
22370 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
22380 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
22390 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
223a0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
223b0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
223c0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
223d0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
223e0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
223f0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
22400 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
22410 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
22420 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
22430 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
22440 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
22450 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
22460 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
22470 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
22480 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
22490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
224b0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
224c0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
224d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224e0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
224f0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
22500 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
22530 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
22540 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
22550 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
22560 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
22570 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
22580 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
22590 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
225a0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
225b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225c0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
225d0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
225e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
225f0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
22600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
22610 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
22620 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
22630 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
22640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22650 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
22660 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
22670 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
22680 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
22690 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
226a0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
226b0 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
226c0 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
226d0 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
226e0 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
226f0 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
22700 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
22710 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
22720 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
22730 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
22740 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
22750 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
22760 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
22770 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
22780 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
22790 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
227a0 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
227b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
227c0 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
227d0 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
227e0 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
227f0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
22800 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
22810 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
22820 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
22830 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
22840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
22850 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
22860 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
22870 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
22880 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
22890 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
228a0 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
228b0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
228c0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
228d0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
228e0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
228f0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
22900 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
22910 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
22920 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
22930 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
22940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
22950 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
22960 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
22970 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
22980 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
22990 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
229a0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
229b0 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
229c0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
229d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
229e0 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
229f0 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63 6f  1 && btreePageco
22a00 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20  unt(pBt)==0 ){. 
22a10 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61     assert( wrFla
22a20 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62  g==0 );.    iTab
22a30 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  le = 0;.  }..  /
22a40 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
22a50 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
22a60 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
22a70 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
22a80 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
22a90 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65  les and link the
22aa0 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65   cursor into the
22ab0 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20   BtShared list. 
22ac0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f   */.  pCur->pgno
22ad0 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
22ae0 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61  ble;.  pCur->iPa
22af0 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d  ge = -1;.  pCur-
22b00 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
22b10 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
22b20 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
22b30 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
22b40 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20  Cur->curFlags = 
22b50 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72  wrFlag ? BTCF_Wr
22b60 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70  iteFlag : 0;.  p
22b70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
22b80 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20  gs = wrFlag ? 0 
22b90 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44  : PAGER_GET_READ
22ba0 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68  ONLY;.  /* If th
22bb0 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d  ere are two or m
22bc0 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ore cursors on t
22bd0 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74  he same btree, t
22be0 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a  hen all such.  *
22bf0 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a  * cursors *must*
22c00 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d   have the BTCF_M
22c10 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
22c20 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42  . */.  for(pX=pB
22c30 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20  t->pCursor; pX; 
22c40 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
22c50 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52     if( pX->pgnoR
22c60 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c  oot==(Pgno)iTabl
22c70 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63  e ){.      pX->c
22c80 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
22c90 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20  Multiple;.      
22ca0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
22cb0 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b  = BTCF_Multiple;
22cc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75  .    }.  }.  pCu
22cd0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
22ce0 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e  pCursor;.  pBt->
22cf0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
22d00 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
22d10 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
22d20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22d30 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _OK;.}.int sqlit
22d40 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20  e3BtreeCursor(. 
22d50 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
22d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d80 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
22d90 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
22dc0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
22dd0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
22de0 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
22e10 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
22e20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
22e30 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
22e40 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
22e50 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
22e60 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29  rg to xCompare()
22e70 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
22e80 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
22e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ea0 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63    /* Write new c
22eb0 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b  ursor here */.){
22ec0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
22ed0 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20   iTable<1 ){.   
22ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
22ef0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c  RUPT_BKPT;.  }el
22f00 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  se{.    sqlite3B
22f10 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
22f20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
22f30 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
22f40 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
22f50 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  pCur);.    sqlit
22f60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
22f70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
22f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
22f90 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  n the size of a 
22fa0 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
22fb0 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  in bytes..**.** 
22fc0 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20  This interfaces 
22fd0 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61  is needed so tha
22fe0 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f  t users of curso
22ff0 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61  rs can prealloca
23000 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74  te.** sufficient
23010 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64   storage to hold
23020 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20   a cursor.  The 
23030 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20  BtCursor object 
23040 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20  is opaque.** to 
23050 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61  users so they ca
23060 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65  nnot do the size
23070 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20  of() themselves 
23080 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c  - they must call
23090 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
230a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
230b0 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28  BtreeCursorSize(
230c0 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
230d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74  ROUND8(sizeof(Bt
230e0 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a  Cursor));.}../*.
230f0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65  ** Initialize me
23100 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62  mory that will b
23110 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
23120 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
23130 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69  ct..**.** The si
23140 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65  mple approach he
23150 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d  re would be to m
23160 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74 69  emset() the enti
23170 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  re object.** to 
23180 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75  zero.  But it tu
23190 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68 65  rns out that the
231a0 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69   apPage[] and ai
231b0 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20  Idx[] arrays.** 
231c0 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  do not need to b
231d0 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65  e zeroed and the
231e0 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20  y are large, so 
231f0 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f  we can save a lo
23200 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65  t.** of run-time
23210 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65   by skipping the
23220 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23230 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74  of those element
23240 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
23250 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
23260 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  o(BtCursor *p){.
23270 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f    memset(p, 0, o
23280 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72  ffsetof(BtCursor
23290 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a  , iPage));.}../*
232a0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
232b0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
232c0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
232d0 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
232e0 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
232f0 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
23300 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
23310 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
23320 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
23330 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
23340 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
23350 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
23360 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
23370 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
23380 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
23390 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
233a0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
233b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
233c0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
233d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
233e0 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  Bt->pCursor!=0 )
233f0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
23400 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a  Cursor==pCur ){.
23410 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
23420 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
23430 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23440 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72     BtCursor *pPr
23450 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ev = pBt->pCurso
23460 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
23470 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e       if( pPrev->
23480 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20  pNext==pCur ){. 
23490 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e           pPrev->
234a0 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
234b0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ext;.          b
234c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
234d0 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20          pPrev = 
234e0 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20  pPrev->pNext;.  
234f0 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41      }while( ALWA
23500 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20  YS(pPrev) );.   
23510 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
23520 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
23530 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
23540 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
23550 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
23560 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
23570 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
23580 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
23590 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
235a0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
235b0 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
235c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
235d0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
235e0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
235f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
23600 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43  ake sure the BtC
23610 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20  ursor* given in 
23620 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73  the argument has
23630 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75   a valid.** BtCu
23640 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74  rsor.info struct
23650 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ure.  If it is n
23660 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64  ot already valid
23670 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50  , call.** btreeP
23680 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
23690 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
236a0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
236b0 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
236c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
236d0 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
236e0 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
236f0 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
23700 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
23710 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65   to btreeParseCe
23720 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ll()..*/.#ifndef
23730 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63   NDEBUG.  static
23740 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
23750 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
23760 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
23770 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74  fo info;.    int
23780 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
23790 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Page;.    memset
237a0 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
237b0 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
237c0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
237d0 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
237e0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  , pCur->aiIdx[iP
237f0 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  age], &info);.  
23800 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
23810 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26  T_DB || memcmp(&
23820 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66  info, &pCur->inf
23830 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
23840 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  ==0 );.  }.#else
23850 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65 72  .  #define asser
23860 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e  tCellInfo(x).#en
23870 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49 54  dif.static SQLIT
23880 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
23890 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
238a0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
238b0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
238c0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ize==0 ){.    in
238d0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
238e0 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72 2d  iPage;.    pCur-
238f0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
23900 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
23910 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
23920 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
23930 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
23940 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
23950 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fo);.  }else{.  
23960 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
23970 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  (pCur);.  }.}..#
23980 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f  ifndef NDEBUG  /
23990 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69  * The next routi
239a0 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74  ne used only wit
239b0 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61  hin assert() sta
239c0 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a  tements */./*.**
239d0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
239e0 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72 73  the given BtCurs
239f0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20  or is valid.  A 
23a00 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20  valid cursor is 
23a10 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63  one.** that is c
23a20 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
23a30 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20  g to a row in a 
23a40 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c  (non-empty) tabl
23a50 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  e..** This is a 
23a60 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75  verification rou
23a70 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c  tine is used onl
23a80 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
23a90 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  ) statements..*/
23aa0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23ab0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42  eCursorIsValid(B
23ac0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
23ad0 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26 26    return pCur &&
23ae0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
23af0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23  URSOR_VALID;.}.#
23b00 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20  endif /* NDEBUG 
23b10 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70  */../*.** Set *p
23b20 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65  Size to the size
23b30 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e   of the buffer n
23b40 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68  eeded to hold th
23b50 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68  e value of.** th
23b60 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75  e key for the cu
23b70 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66  rrent entry.  If
23b80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
23b90 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  ot pointing.** t
23ba0 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c  o a valid entry,
23bb0 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
23bc0 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  o 0. .**.** For 
23bd0 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  a table with the
23be0 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74   INTKEY flag set
23bf0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
23c00 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a  eturns the key.*
23c10 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68  * itself, not th
23c20 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
23c30 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  s in the key..**
23c40 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
23c50 75 73 74 20 70 6f 73 69 74 69 6f 6e 20 74 68 65  ust position the
23c60 20 63 75 72 73 6f 72 20 70 72 69 6f 72 20 74 6f   cursor prior to
23c70 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
23c80 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54  outine..** .** T
23c90 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
23ca0 6f 74 20 66 61 69 6c 2e 20 20 49 74 20 61 6c 77  ot fail.  It alw
23cb0 61 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ays returns SQLI
23cc0 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20  TE_OK.  .*/.int 
23cd0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
23ce0 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
23cf0 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  ur, i64 *pSize){
23d00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
23d10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
23d20 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23d30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
23d40 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67  SOR_VALID );.  g
23d50 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
23d60 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
23d70 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
23d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a  ;.}../*.** Set *
23da0 70 53 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d  pSize to the num
23db0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
23dc0 64 61 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72  data in the entr
23dd0 79 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  y the.** cursor 
23de0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
23df0 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63   to..**.** The c
23e00 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61  aller must guara
23e10 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 63 75  ntee that the cu
23e20 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
23e30 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a   to a non-NULL.*
23e40 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20  * valid entry.  
23e50 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
23e60 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
23e70 65 64 75 72 65 20 6d 75 73 74 20 67 75 61 72 61  edure must guara
23e80 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  ntee.** that the
23e90 20 63 75 72 73 6f 72 20 68 61 73 20 43 75 72 73   cursor has Curs
23ea0 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  or.eState==CURSO
23eb0 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46  R_VALID..**.** F
23ec0 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f  ailure is not po
23ed0 73 73 69 62 6c 65 2e 20 20 54 68 69 73 20 66 75  ssible.  This fu
23ee0 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72 65  nction always re
23ef0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
23f00 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 6a 75 73  .** It might jus
23f10 74 20 61 73 20 77 65 6c 6c 20 62 65 20 61 20 70  t as well be a p
23f20 72 6f 63 65 64 75 72 65 20 28 72 65 74 75 72 6e  rocedure (return
23f30 69 6e 67 20 76 6f 69 64 29 20 62 75 74 20 77 65  ing void) but we
23f40 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20   continue.** to 
23f50 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
23f60 72 20 72 65 73 75 6c 74 20 63 6f 64 65 20 66 6f  r result code fo
23f70 72 20 68 69 73 74 6f 72 69 63 61 6c 20 72 65 61  r historical rea
23f80 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sons..*/.int sql
23f90 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a  ite3BtreeDataSiz
23fa0 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
23fb0 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20  , u32 *pSize){. 
23fc0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
23fd0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
23fe0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
23ff0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
24000 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
24010 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
24020 67 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge>=0 );.  asser
24030 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
24040 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
24050 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  H );.  assert( p
24060 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
24070 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79  ->iPage]->intKey
24080 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74  Leaf==1 );.  get
24090 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
240a0 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d    *pSize = pCur-
240b0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a  >info.nPayload;.
240c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
240d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  OK;.}../*.** Giv
240e0 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
240f0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
24100 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
24110 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
24120 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
24130 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
24140 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
24150 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
24160 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
24170 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
24180 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
24190 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
241a0 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
241b0 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
241c0 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
241d0 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
241e0 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
241f0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
24200 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
24210 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
24220 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
24230 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
24240 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
24250 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
24260 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
24270 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
24280 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
24290 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
242a0 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
242b0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
242c0 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
242d0 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
242e0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
242f0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
24300 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
24310 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
24320 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
24330 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
24340 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
24350 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
24360 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
24370 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
24380 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
24390 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
243a0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
243b0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
243c0 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
243d0 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
243e0 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
243f0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
24400 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
24410 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
24420 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
24430 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
24440 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
24450 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
24460 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
24470 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
24480 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
24490 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
244a0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
244b0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
244c0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
244d0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
244e0 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
244f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
24500 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
24510 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
24520 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
24530 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
24540 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
24550 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
24560 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
24570 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
24580 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
24590 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
245a0 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
245b0 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
245c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
245d0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
245e0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
245f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
24600 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
24610 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
24620 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
24630 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
24640 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
24650 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
24660 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
24670 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
24680 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
24690 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
246a0 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
246b0 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
246c0 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
246d0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
246e0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
246f0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
24700 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
24710 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
24720 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
24730 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
24740 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
24750 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
24760 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
24770 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
24780 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
24790 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
247a0 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
247b0 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
247c0 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
247d0 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
247e0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
247f0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
24800 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
24810 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
24820 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
24830 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
24840 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
24850 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
24860 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
24870 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
24880 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
24890 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
248a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
248b0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
248c0 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
248d0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
248e0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
248f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24900 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
24910 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
24920 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
24930 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
24940 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
24950 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
24960 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
24970 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
24980 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
24990 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
249a0 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
249b0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
249c0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
249d0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
249e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
249f0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
24a00 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
24a10 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
24a20 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
24a30 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
24a40 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
24a50 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
24a60 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
24a70 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
24a80 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
24a90 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
24aa0 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
24ab0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
24ac0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
24ad0 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
24ae0 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
24af0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
24b00 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
24b10 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
24b20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
24b30 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
24b40 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
24b50 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
24b60 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
24b70 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
24b80 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
24b90 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
24ba0 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
24bb0 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
24bc0 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
24bd0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
24be0 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
24bf0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
24c00 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
24c10 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
24c20 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
24c30 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
24c40 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
24c50 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
24c60 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
24c70 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
24c80 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
24c90 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
24ca0 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
24cb0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
24cc0 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
24cd0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
24ce0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
24cf0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
24d00 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
24d10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d20 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
24d30 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
24d40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24d50 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
24d60 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
24d70 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
24d80 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
24d90 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
24da0 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
24db0 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
24dc0 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
24dd0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
24de0 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
24df0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
24e00 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
24e10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24e20 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
24e30 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
24e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24e50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
24e60 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
24e70 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
24e80 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
24e90 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
24ea0 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
24eb0 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
24ec0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
24ed0 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
24ee0 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
24ef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24f00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
24f10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
24f20 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
24f30 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
24f40 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
24f50 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
24f60 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
24f70 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
24f80 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
24f90 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
24fa0 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
24fb0 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
24fc0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
24fd0 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
24fe0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
24ff0 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
25000 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
25010 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
25020 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
25030 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72  **   2: The oper
25040 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
25050 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65   Do not populate
25060 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
25070 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74  che..**.** A tot
25080 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65  al of "amt" byte
25090 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72  s are read or wr
250a0 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20  itten beginning 
250b0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20  at "offset"..** 
250c0 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20  Data is read to 
250d0 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66  or from the buff
250e0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54  er pBuf..**.** T
250f0 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67  he content being
25100 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
25110 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e   might appear on
25120 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a   the main page.*
25130 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65  * or be scattere
25140 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c  d out on multipl
25150 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
25160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25170 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e  urrent cursor en
25180 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  try uses one or 
25190 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
251a0 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65  ges and the.** e
251b0 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  Op argument is n
251c0 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74  ot 2, this funct
251d0 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65  ion may allocate
251e0 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
251f0 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61  azily .** popula
25200 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
25210 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
25220 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
25230 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a  .aOverflow). .**
25240 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
25250 73 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65  s use this cache
25260 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67   to make seeking
25270 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
25280 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65   offset .** more
25290 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a   efficient..**.*
252a0 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c  * Once an overfl
252b0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
252c0 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
252d0 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65  cated, it may be
252e0 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20  .** invalidated 
252f0 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75  if some other cu
25300 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74  rsor writes to t
25310 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f  he same table, o
25320 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73  r if.** the curs
25330 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61  or is moved to a
25340 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20   different row. 
25350 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e  Additionally, in
25360 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
25370 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  mode, the follow
25380 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69  ing events may i
25390 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65  nvalidate an ove
253a0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
253b0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  cache..**.**   *
253c0 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   An incremental 
253d0 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41  vacuum,.**   * A
253e0 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f   commit in auto_
253f0 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f  vacuum="full" mo
25400 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74  de,.**   * Creat
25410 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79  ing a table (may
25420 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
25430 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25440 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
25450 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a   accessPayload(.
25460 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
25470 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
25480 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
25490 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
254a0 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c  */.  u32 offset,
254b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67            /* Beg
254c0 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20  in reading this 
254d0 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64  far into payload
254e0 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20   */.  u32 amt,  
254f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25500 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  ad this many byt
25510 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  es */.  unsigned
25520 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20   char *pBuf, /* 
25530 57 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20  Write the bytes 
25540 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
25550 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20   */ .  int eOp  
25560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
25570 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
25580 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
25590 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
255a0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
255b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
255c0 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64  TE_OK;.  int iId
255d0 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  x = 0;.  MemPage
255e0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
255f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
25600 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61  ge]; /* Btree pa
25610 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e  ge of current en
25620 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  try */.  BtShare
25630 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
25640 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
25650 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
25660 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
25670 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  s to */.#ifdef S
25680 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
25690 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73  RFLOW_READ.  uns
256a0 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e  igned char * con
256b0 73 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70  st pBufStart = p
256c0 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b  Buf;.  int bEnd;
256d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256f0 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
25700 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61  ing to end of da
25710 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  ta */.#endif..  
25720 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b  assert( pPage );
25730 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
25740 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25750 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
25760 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
25770 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
25780 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
25790 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
257a0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
257b0 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
257c0 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b   || offset==0 );
257d0 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74      /* Always st
257e0 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69  art from beginni
257f0 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f  ng for eOp==2 */
25800 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
25810 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
25820 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
25830 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20  Payload;.#ifdef 
25840 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
25850 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45  ERFLOW_READ.  bE
25860 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d  nd = offset+amt=
25870 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  =pCur->info.nPay
25880 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61  load;.#endif.  a
25890 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d  ssert( offset+am
258a0 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t <= pCur->info.
258b0 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69  nPayload );..  i
258c0 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  f( &aPayload[pCu
258d0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20  r->info.nLocal] 
258e0 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  > &pPage->aData[
258f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d  pBt->usableSize]
25900 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e   ){.    /* Tryin
25910 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69  g to read or wri
25920 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  te past the end 
25930 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61  of the data is a
25940 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72  n error */.    r
25950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
25960 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
25970 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
25980 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
25990 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
259a0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
259b0 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
259c0 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
259d0 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
259e0 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
259f0 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
25a00 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
25a10 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
25a20 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
25a30 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
25a40 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
25a50 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
25a60 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
25a70 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20 70 50  (eOp & 0x01), pP
25a80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
25a90 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
25aa0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
25ab0 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65    amt -= a;.  }e
25ac0 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  lse{.    offset 
25ad0 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  -= pCur->info.nL
25ae0 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66  ocal;.  }...  if
25af0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25b00 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
25b10 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c 53 69  const u32 ovflSi
25b20 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
25b30 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79  Size - 4;  /* By
25b40 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20  tes content per 
25b50 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20  ovfl page */.   
25b60 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a   Pgno nextPage;.
25b70 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20  .    nextPage = 
25b80 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f  get4byte(&aPaylo
25b90 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad[pCur->info.nL
25ba0 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  ocal]);..    /* 
25bb0 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
25bc0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20  aOverflow[] has 
25bd0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
25be0 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
25bf0 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65  now..    ** Exce
25c00 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63  pt, do not alloc
25c10 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  ate aOverflow[] 
25c20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20  for eOp==2..    
25c30 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f  **.    ** The aO
25c40 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
25c50 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20  is sized at one 
25c60 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
25c70 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
25c80 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66   ** in the overf
25c90 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
25ca0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
25cb0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
25cc0 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20   page is.    ** 
25cd0 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66  stored in aOverf
25ce0 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76  low[0], etc. A v
25cf0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
25d00 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
25d10 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20  ay.    ** means 
25d20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20  "not yet known" 
25d30 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
25d40 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
25d50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
25d60 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75 72 2d  eOp!=2 && (pCur-
25d70 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
25d80 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
25d90 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
25da0 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
25db0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
25dc0 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
25dd0 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
25de0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
25df0 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f  >pCur->nOvflAllo
25e00 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  c ){.        Pgn
25e10 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a  o *aNew = (Pgno*
25e20 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28  )sqlite3Realloc(
25e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75  .            pCu
25e40 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f  r->aOverflow, nO
25e50 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e  vfl*2*sizeof(Pgn
25e60 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
25e70 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
25e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
25e90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
25ea0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
25eb0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
25ec0 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f  >nOvflAlloc = nO
25ed0 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20  vfl*2;.         
25ee0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
25ef0 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20   = aNew;.       
25f00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
25f10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25f20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  OK ){.        me
25f30 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72  mset(pCur->aOver
25f40 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73  flow, 0, nOvfl*s
25f50 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20  izeof(Pgno));.  
25f60 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
25f70 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
25f80 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a  idOvfl;.      }.
25f90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
25fa0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
25fb0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
25fc0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
25fd0 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20   and the.    ** 
25fe0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
25ff0 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
26000 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
26010 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a  lid, skip.    **
26020 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e   directly to it.
26030 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
26040 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
26050 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
26060 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75  )!=0.     && pCu
26070 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
26080 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20  set/ovflSize].  
26090 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20    ){.      iIdx 
260a0 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
260b0 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
260c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
260d0 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
260e0 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
260f0 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
26100 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b     }..    for( ;
26110 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26120 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
26130 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20  age; iIdx++){.. 
26140 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
26150 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
26160 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
26170 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
26180 20 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e       if( (pCur->
26190 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
261a0 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b  ValidOvfl)!=0 ){
261b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
261c0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
261d0 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20  [iIdx]==0.      
261e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
261f0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26200 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20  x]==nextPage.   
26210 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
26220 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
26230 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
26240 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65  rflow[iIdx] = ne
26250 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  xtPage;.      }.
26260 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
26270 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
26280 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
26290 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
262a0 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
262b0 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
262c0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
262d0 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
262e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
262f0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
26300 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
26310 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
26320 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
26330 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
26340 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
26350 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
26360 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
26370 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
26380 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
26390 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
263a0 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
263b0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
263c0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
263d0 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
263e0 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  y must be alloca
263f0 74 65 64 20 62 65 63 61 75 73 65 20 65 4f 70 21  ted because eOp!
26400 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65  =2.        ** he
26410 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20  re.  If eOp==2, 
26420 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61  then offset==0 a
26430 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68 20 69  nd this branch i
26440 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20  s never taken.. 
26450 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
26460 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32    assert( eOp!=2
26470 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
26480 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  rt( pCur->curFla
26490 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
264a0 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61  vfl );.        a
264b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74  ssert( pCur->pBt
264c0 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62  ree->db==pBt->db
264d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
264e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
264f0 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
26500 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
26510 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26520 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
26530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26540 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
26550 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74  owPage(pBt, next
26560 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61  Page, 0, &nextPa
26570 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
26580 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
26590 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
265a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
265b0 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
265c0 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
265d0 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
265e0 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
265f0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
26600 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
26610 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
26620 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
26630 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
26640 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
26650 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52  IRECT_OVERFLOW_R
26660 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69  EAD.        sqli
26670 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65  te3_file *fd;.#e
26680 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74  ndif.        int
26690 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
266a0 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
266b0 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
266c0 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
266d0 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
266e0 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65          }..#ifde
266f0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
26700 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
26710 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20        /* If all 
26720 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
26730 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20  e true:.        
26740 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
26750 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61  1) this is a rea
26760 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64  d operation, and
26770 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32   .        **   2
26780 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72  ) data is requir
26790 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ed from the star
267a0 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c  t of this overfl
267b0 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20  ow page, and.   
267c0 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65       **   3) the
267d0 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c   database is fil
267e0 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20  e-backed, and.  
267f0 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68        **   4) th
26800 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77  ere is no open w
26810 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
26820 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
26830 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61     5) the databa
26840 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20  se is not a WAL 
26850 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20  database,.      
26860 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61    **   6) all da
26870 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ta from the page
26880 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a   is being read..
26890 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20          **   7) 
268a0 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
268b0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
268c0 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65  en read into the
268d0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a   output buffer .
268e0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
268f0 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20     ** then data 
26900 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65  can be read dire
26910 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61  ctly from the da
26920 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f  tabase file into
26930 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
26940 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62  output buffer, b
26950 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67  ypassing the pag
26960 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68  e-cache altogeth
26970 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a  er. This speeds.
26980 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f          ** up lo
26990 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f  ading large reco
269a0 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61  rds that span ma
269b0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
269c0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
269d0 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30        if( (eOp&0
269e0 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20  x01)==0         
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a10 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (1) */.         
26a20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20  && offset==0    
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a50 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a        /* (2) */.
26a60 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e           && (bEn
26a70 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65  d || a==ovflSize
26a80 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26aa0 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
26ab0 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e    && pBt->inTran
26ac0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52  saction==TRANS_R
26ad0 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20  EAD             
26ae0 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a          /* (4) *
26af0 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66  /.         && (f
26b00 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
26b10 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72  File(pBt->pPager
26b20 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20  ))->pMethods    
26b30 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20   /* (3) */.     
26b40 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67      && pBt->pPag
26b50 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30  e1->aData[19]==0
26b60 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20  x01             
26b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29            /* (5)
26b80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
26b90 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53  &pBuf[-4]>=pBufS
26ba0 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20  tart            
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bc0 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20     /* (7) */.   
26bd0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
26be0 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20    u8 aSave[4];. 
26bf0 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72           u8 *aWr
26c00 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b  ite = &pBuf[-4];
26c10 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
26c20 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53  t( aWrite>=pBufS
26c30 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20  tart );         
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c50 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a  /* hence (7) */.
26c60 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
26c70 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20  (aSave, aWrite, 
26c80 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  4);.          rc
26c90 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
26ca0 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34  (fd, aWrite, a+4
26cb0 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65  , (i64)pBt->page
26cc0 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31  Size*(nextPage-1
26cd0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65  ));.          ne
26ce0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
26cf0 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20  e(aWrite);.     
26d00 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69       memcpy(aWri
26d10 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20  te, aSave, 4);. 
26d20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
26d30 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20  dif..        {. 
26d40 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
26d50 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
26d60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26d70 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
26d80 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
26d90 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20  &pDbPage,.      
26da0 20 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78          ((eOp&0x
26db0 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47  01)==0 ? PAGER_G
26dc0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
26dd0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
26de0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
26df0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26e00 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61           aPayloa
26e10 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
26e20 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
26e30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65  ;.            ne
26e40 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
26e50 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  e(aPayload);.   
26e60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
26e70 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
26e80 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
26e90 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30  Buf, a, (eOp&0x0
26ea0 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  1), pDbPage);.  
26eb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26ec0 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
26ed0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
26ee0 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
26ef0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26f00 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20    }.        amt 
26f10 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42  -= a;.        pB
26f20 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d  uf += a;.      }
26f30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
26f40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26f50 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
26f60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
26f70 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
26f80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26f90 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
26fa0 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
26fb0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
26fc0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
26fd0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
26fe0 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
26ff0 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e  red into pBuf[].
27000 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a    The transfer.*
27010 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66  * begins at "off
27020 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  set"..**.** The 
27030 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75  caller must ensu
27040 72 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20  re that pCur is 
27050 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61  pointing to a va
27060 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68  lid row.** in th
27070 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52  e table..**.** R
27080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
27090 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
270a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
270b0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
270c0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
270d0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
270e0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
270f0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
27100 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
27110 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
27120 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
27130 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
27140 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
27150 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
27160 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
27170 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
27180 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27190 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
271a0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
271b0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
271c0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
271d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
271e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
271f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27200 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
27210 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27220 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
27230 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
27240 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
27250 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
27260 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
27270 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
27280 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
27290 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
272a0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
272b0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
272c0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
272d0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
272e0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
272f0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
27300 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
27310 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
27320 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
27330 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
27340 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
27350 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
27360 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
27370 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
27380 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
27390 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
273a0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
273b0 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
273c0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
273d0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
273e0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
273f0 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
27400 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
27410 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
27420 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
27430 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
27440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27450 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
27460 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
27470 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
27480 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
27490 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
274a0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
274b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
274c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
274d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
274e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
274f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27500 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
27510 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27520 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
27530 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
27540 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
27550 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27560 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
27570 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
27580 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
27590 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
275a0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
275b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
275c0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
275d0 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
275e0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
275f0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
27600 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
27610 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
27620 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
27630 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
27640 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
27650 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
27660 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
27670 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
27680 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
27690 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
276a0 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
276b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
276c0 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
276d0 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
276e0 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
276f0 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
27700 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
27710 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
27720 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
27730 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
27740 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
27750 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
27760 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
27770 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
27780 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
27790 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
277a0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
277b0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
277c0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
277d0 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
277e0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
277f0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
27800 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
27810 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
27820 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
27830 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
27840 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
27850 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
27860 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
27870 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
27880 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
27890 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
278a0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
278b0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
278c0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
278d0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
278e0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
278f0 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
27900 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
27910 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
27920 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
27930 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
27940 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
27950 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
27960 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
27970 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
27980 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
27990 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
279a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
279b0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
279c0 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
279d0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
279e0 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
279f0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
27a00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
27a10 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
27a20 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ere */.){.  u32 
27a30 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
27a40 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
27a50 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
27a60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27a70 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
27a80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
27a90 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
27aa0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27ab0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
27ac0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
27ad0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
27ae0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
27af0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
27b00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
27b10 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
27b20 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
27b30 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
27b40 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
27b50 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
27b60 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
27b70 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
27b80 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65  oad>pCur->apPage
27b90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
27ba0 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Data || CORRUPT_
27bb0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
27bc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
27bd0 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  oad<pCur->apPage
27be0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
27bf0 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50  DataEnd ||CORRUP
27c00 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28  T_DB);.  amt = (
27c10 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67  int)(pCur->apPag
27c20 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27c30 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
27c40 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b  >info.pPayload);
27c50 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
27c60 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61  o.nLocal<amt ) a
27c70 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  mt = pCur->info.
27c80 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20  nLocal;.  *pAmt 
27c90 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20  = amt;.  return 
27ca0 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66  (void*)pCur->inf
27cb0 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  o.pPayload;.}...
27cc0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
27cd0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
27ce0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
27cf0 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
27d00 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
27d10 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
27d20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
27d30 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
27d40 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
27d50 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
27d60 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
27d70 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
27d80 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
27d90 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
27da0 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
27db0 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
27dc0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
27dd0 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
27de0 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
27df0 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
27e00 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
27e10 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
27e20 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
27e30 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
27e40 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
27e50 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
27e60 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
27e70 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
27e80 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
27e90 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
27ea0 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
27eb0 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
27ec0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
27ed0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
27ee0 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
27ef0 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
27f00 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
27f10 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
27f20 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
27f30 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a  ur, u32 *pAmt){.
27f40 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61    return fetchPa
27f50 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
27f60 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20  );.}.const void 
27f70 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74  *sqlite3BtreeDat
27f80 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  aFetch(BtCursor 
27f90 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74  *pCur, u32 *pAmt
27fa0 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63  ){.  return fetc
27fb0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
27fc0 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  Amt);.}.../*.** 
27fd0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
27fe0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
27ff0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
28000 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
28010 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
28020 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
28030 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
28040 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  to..**.** This f
28050 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
28060 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
28070 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
28080 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66  r flags field of
28090 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c  .** the new chil
280a0 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20  d page does not 
280b0 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20  match the flags 
280c0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72  field of the par
280d0 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20  ent (i.e..** if 
280e0 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61  an intkey page a
280f0 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65  ppears to be the
28100 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e   parent of a non
28110 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72  -intkey page, or
28120 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e  .** vice-versa).
28130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
28140 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72  oveToChild(BtCur
28150 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e  sor *pCur, u32 n
28160 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61  ewPgno){.  BtSha
28170 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
28180 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
28190 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
281a0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
281b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
281c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
281d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
281e0 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
281f0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
28200 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28210 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69  >iPage>=0 );.  i
28220 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
28230 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  (BTCURSOR_MAX_DE
28240 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65  PTH-1) ){.    re
28250 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
28260 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
28270 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
28280 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
28290 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
282a0 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
282b0 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43  ValidOvfl);.  pC
282c0 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70  ur->iPage++;.  p
282d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
282e0 3e 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72  >iPage] = 0;.  r
282f0 65 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74  eturn getAndInit
28300 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
28310 6f 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  o, &pCur->apPage
28320 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20  [pCur->iPage],. 
28330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28340 20 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75         pCur, pCu
28350 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
28360 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
28370 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  _DEBUG./*.** Pag
28380 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
28390 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
283a0 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
283b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
283c0 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
283d0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
283e0 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
283f0 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
28400 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
28410 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
28420 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
28430 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
28440 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
28450 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
28460 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
28470 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
28480 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
28490 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
284a0 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
284b0 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
284c0 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
284d0 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
284e0 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  {.  if( CORRUPT_
284f0 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  DB ) return;  /*
28500 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   The conditions 
28510 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67  tested below mig
28520 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20  ht not be true. 
28530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28540 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e             ** in
28550 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
28560 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ase */.  assert(
28570 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e   iIdx<=pParent->
28580 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69  nCell );.  if( i
28590 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx==pParent->nC
285a0 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ell ){.    asser
285b0 74 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t( get4byte(&pPa
285c0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
285d0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
285e0 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ])==iChild );.  
285f0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
28600 74 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  t( get4byte(find
28610 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49  Cell(pParent, iI
28620 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  dx))==iChild );.
28630 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64    }.}.#else.#  d
28640 65 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65  efine assertPare
28650 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a  ntIndex(x,y,z) .
28660 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
28670 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70  ve the cursor up
28680 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70   to the parent p
28690 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d  age..**.** pCur-
286a0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74  >idx is set to t
286b0 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68  he cell index th
286c0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
286d0 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
286e0 65 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f  e page we are co
286f0 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77  ming from.  If w
28700 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
28710 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d  m the.** right-m
28720 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74  ost child page t
28730 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73  hen pCur->idx is
28740 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65   set to one more
28750 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72   than.** the lar
28760 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e  gest cell index.
28770 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28780 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  moveToParent(BtC
28790 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
287a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
287b0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
287c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
287d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
287e0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
287f0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
28800 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
28810 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28820 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
28830 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
28840 78 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  x(.    pCur->apP
28850 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28860 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
28870 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28880 2d 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e  -1], .    pCur->
28890 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
288a0 67 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  ge]->pgno.  );. 
288b0 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
288c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
288d0 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
288e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
288f0 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  -1]->nCell );.  
28900 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
28910 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
28920 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
28930 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
28940 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65  ValidOvfl);.  re
28950 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
28960 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  (pCur->apPage[pC
28970 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d  ur->iPage--]);.}
28980 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
28990 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
289a0 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
289b0 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
289c0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
289d0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
289e0 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
289f0 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
28a00 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
28a10 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
28a20 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
28a30 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
28a40 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
28a50 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
28a60 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
28a70 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
28a80 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
28a90 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
28aa0 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
28ab0 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
28ac0 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
28ad0 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
28ae0 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
28af0 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
28b00 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
28b10 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
28b20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
28b30 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
28b40 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f  URSOR_INVALID. O
28b50 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75  therwise, the cu
28b60 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
28b70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
28b80 74 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65  t.** cell locate
28b90 64 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f  d on the root (o
28ba0 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
28bb0 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
28bc0 73 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20  sor state.** is 
28bd0 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41  set to CURSOR_VA
28be0 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  LID..**.** If th
28bf0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
28c00 72 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  rns successfully
28c10 2c 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75  , it may be assu
28c20 6d 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  med that the.** 
28c30 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
28c40 73 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  s indicate that 
28c50 74 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f  the [virtual] ro
28c60 6f 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65  ot-page is the e
28c70 78 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64  xpected .** kind
28c80 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20   of b-tree page 
28c90 28 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70  (i.e. if when op
28ca0 65 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  ening the cursor
28cb0 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20   the caller did 
28cc0 6e 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61  not.** specify a
28cd0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
28ce0 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
28cf0 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35  e is set to 0x05
28d00 20 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64   or 0x0D,.** ind
28d10 69 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  icating a table 
28d20 62 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68  b-tree, or if th
28d30 65 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65  e caller did spe
28d40 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a  cify a KeyInfo .
28d50 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65  ** structure the
28d60 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
28d70 65 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78  et to 0x02 or 0x
28d80 30 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61  0A, indicating a
28d90 6e 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65  n index.** b-tre
28da0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  e)..*/.static in
28db0 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43  t moveToRoot(BtC
28dc0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
28dd0 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a  MemPage *pRoot;.
28de0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
28df0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
28e00 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28e10 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
28e20 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
28e30 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
28e40 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
28e50 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
28e60 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
28e70 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
28e80 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
28e90 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
28ea0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
28eb0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
28ec0 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
28ed0 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
28ee0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
28ef0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
28f00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28f10 75 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51  ur->skipNext!=SQ
28f20 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20  LITE_OK );.     
28f30 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
28f40 69 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ipNext;.    }.  
28f50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
28f60 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
28f70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
28f80 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
28f90 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
28fa0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Page ){.      as
28fb0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
28fc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21  ge[pCur->iPage]!
28fd0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  =0 );.      rele
28fe0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
28ff0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29000 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
29010 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
29020 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
29030 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53   ){.    pCur->eS
29040 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
29050 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72  VALID;.    retur
29060 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
29070 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
29080 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28  ( pCur->iPage==(
29090 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  -1) );.    rc = 
290a0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
290b0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74  Cur->pBtree->pBt
290c0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
290d0 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
290e0 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0],.            
290f0 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70              0, p
29100 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
29110 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
29120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29130 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
29140 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
29150 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
29160 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rc;.    }.    pC
29170 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
29180 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
29190 65 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ey = pCur->apPag
291a0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20  e[0]->intKey;.  
291b0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
291c0 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61  ->apPage[0];.  a
291d0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
291e0 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
291f0 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
29200 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
29210 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
29220 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
29230 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
29240 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
29250 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
29260 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
29270 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
29280 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
29290 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
292a0 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
292b0 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
292c0 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
292d0 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
292e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
292f0 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
29300 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
29310 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
29320 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
29330 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
29340 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
29350 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
29360 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
29370 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
29380 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
29390 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
293a0 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
293b0 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
293c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
293d0 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
293e0 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
293f0 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
29400 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
29410 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
29420 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
29430 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
29440 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
29450 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
29460 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
29470 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
29480 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
29490 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
294a0 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
294b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
294c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
294d0 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49    }..  pCur->aiI
294e0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
294f0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
29500 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
29510 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
29520 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
29530 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
29540 66 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f  fl);..  if( pRoo
29550 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  t->nCell>0 ){.  
29560 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
29570 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
29580 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f   }else if( !pRoo
29590 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50  t->leaf ){.    P
295a0 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20  gno subpage;.   
295b0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f   if( pRoot->pgno
295c0 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
295d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
295e0 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
295f0 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
29600 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
29610 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
29620 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
29630 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
29640 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
29650 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
29660 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29670 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29680 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
29690 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
296a0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
296b0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
296c0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
296d0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
296e0 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
296f0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
29700 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
29710 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
29720 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
29730 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
29740 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
29750 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
29760 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
29770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
29780 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
29790 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
297a0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
297b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
297c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
297d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
297e0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
297f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29800 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
29810 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29820 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
29830 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
29840 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
29850 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
29860 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
29870 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
29880 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
29890 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
298a0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
298b0 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  e(findCell(pPage
298c0 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  , pCur->aiIdx[pC
298d0 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20  ur->iPage]));.  
298e0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
298f0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
29900 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
29910 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
29920 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
29930 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  o the right-most
29940 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
29950 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  ath the.** page 
29960 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
29970 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
29980 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64  g.  Notice the d
29990 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74  ifference.** bet
299a0 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  ween moveToLeftm
299b0 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f  ost() and moveTo
299c0 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f  Rightmost().  mo
299d0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a  veToLeftmost().*
299e0 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74  * finds the left
299f0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
29a00 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20  ath the *entry* 
29a10 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69  whereas moveToRi
29a20 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  ghtmost().** fin
29a30 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ds the right-mos
29a40 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
29a50 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a  the *page*..**.*
29a60 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  * The right-most
29a70 20 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e   entry is the on
29a80 65 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65  e with the large
29a90 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73  st key - the las
29aa0 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65  t.** key in asce
29ab0 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a  nding order..*/.
29ac0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
29ad0 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72  oRightmost(BtCur
29ae0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
29af0 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
29b00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29b10 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
29b20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
29b30 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
29b40 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
29b50 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29b60 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
29b70 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70   );.  while( !(p
29b80 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
29b90 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
29ba0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  )->leaf ){.    p
29bb0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
29bc0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
29bd0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
29be0 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  );.    pCur->aiI
29bf0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29c00 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
29c10 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
29c20 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
29c30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
29c40 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
29c50 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29c60 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65  ->iPage] = pPage
29c70 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73  ->nCell-1;.  ass
29c80 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
29c90 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73  nSize==0 );.  as
29ca0 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72  sert( (pCur->cur
29cb0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
29cc0 69 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20  idNKey)==0 );.  
29cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29ce0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
29cf0 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66   cursor to the f
29d00 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
29d10 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
29d20 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
29d30 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a   success.  Set *
29d40 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65  pRes to 0 if the
29d50 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79   cursor actually
29d60 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74   points to somet
29d70 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a  hing.** or set *
29d80 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65  pRes to 1 if the
29d90 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
29da0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
29db0 74 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73  treeFirst(BtCurs
29dc0 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
29dd0 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
29de0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29df0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29e00 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29e10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29e20 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
29e30 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
29e40 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
29e50 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
29e60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29e70 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
29e80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
29e90 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
29ea0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
29eb0 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
29ec0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29ed0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
29ee0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
29ef0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
29f00 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
29f10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29f20 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29  Page]->nCell>0 )
29f30 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
29f40 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
29f50 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
29f60 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
29f70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29f80 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29f90 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
29fa0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
29fb0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
29fc0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
29fd0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
29fe0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
29ff0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
2a000 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
2a010 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
2a020 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
2a030 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
2a040 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
2a050 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2a060 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2a070 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72  nt rc;. .  asser
2a080 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2a090 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2a0a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a0b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2a0c0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2a0d0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
2a0e0 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
2a0f0 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
2a100 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
2a110 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
2a120 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
2a130 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2a140 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
2a150 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2a160 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
2a170 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2a180 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
2a190 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
2a1a0 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
2a1b0 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
2a1c0 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
2a1d0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2a1e0 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
2a1f0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
2a200 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2a210 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
2a220 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a230 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
2a240 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
2a250 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
2a260 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2a270 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a280 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
2a290 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a2a0 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
2a2b0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a2c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a2d0 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
2a2e0 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2a2f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2a300 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2a310 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2a320 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a330 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2a340 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2a350 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
2a360 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2a370 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2a380 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a390 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2a3a0 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2a3b0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2a3c0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a3d0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a3e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
2a3f0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2a400 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2a410 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2a420 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a430 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a440 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2a450 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2a460 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a470 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2a480 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
2a490 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
2a4a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2a4b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
2a4c0 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
2a4d0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2a4e0 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
2a4f0 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
2a500 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
2a510 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
2a520 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
2a530 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
2a540 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
2a550 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
2a560 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
2a570 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
2a580 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
2a590 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
2a5a0 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
2a5b0 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
2a5c0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2a5d0 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
2a5e0 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
2a5f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
2a600 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
2a610 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
2a620 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
2a630 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
2a640 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
2a650 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
2a660 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
2a670 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
2a680 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
2a690 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
2a6a0 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
2a6b0 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
2a6c0 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
2a6d0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2a6e0 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
2a6f0 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
2a700 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
2a710 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
2a720 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
2a730 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
2a740 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
2a750 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
2a760 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2a770 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
2a780 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2a790 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2a7a0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
2a7d0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
2a7e0 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2a7f0 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
2a800 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
2a810 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
2a820 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
2a830 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
2a840 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
2a850 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
2a860 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2a870 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2a880 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2a890 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
2a8a0 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
2a8b0 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
2a8c0 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
2a8d0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2a8e0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a8f0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2a900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a910 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
2a920 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2a930 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74  *.** For index t
2a940 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b  ables, the pIdxK
2a950 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64  ey->eqSeen field
2a960 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20   is set to 1 if 
2a970 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20  there.** exists 
2a980 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
2a990 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74  table that exact
2a9a0 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b  ly matches pIdxK
2a9b0 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ey.  .*/.int sql
2a9c0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
2a9d0 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
2a9e0 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
2a9f0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
2aa00 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
2aa10 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
2aa20 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
2aa30 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
2aa40 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
2aa50 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
2aa60 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
2aa70 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
2aa80 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
2aa90 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
2aaa0 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
2aab0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
2aac0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
2aad0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2aae0 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
2aaf0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2ab00 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f  t rc;.  RecordCo
2ab10 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d  mpare xRecordCom
2ab20 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pare;..  assert(
2ab30 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2ab40 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2ab50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2ab60 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2ab70 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2ab80 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2ab90 70 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74  pRes );.  assert
2aba0 28 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d  ( (pIdxKey==0)==
2abb0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2abc0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
2abd0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
2abe0 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
2abf0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
2ac00 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
2ac10 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
2ac20 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
2ac30 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
2ac40 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
2ac50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2ac60 4f 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75  OR_VALID && (pCu
2ac70 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2ac80 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30  CF_ValidNKey)!=0
2ac90 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 63 75 72  .   && pCur->cur
2aca0 49 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  IntKey .  ){.   
2acb0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2acc0 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2acd0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2ace0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2acf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2ad00 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2ad10 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
2ad20 4c 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72  Last)!=0 && pCur
2ad30 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2ad40 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2ad50 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
2ad60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ad70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2ad80 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
2ad90 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
2ada0 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
2adb0 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
2adc0 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65  ;.    pIdxKey->e
2add0 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  rrCode = 0;.    
2ade0 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d  assert( pIdxKey-
2adf0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a  >default_rc==1 .
2ae00 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2ae10 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2ae20 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
2ae30 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2ae40 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20  _rc==-1.    );. 
2ae50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63   }else{.    xRec
2ae60 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20  ordCompare = 0; 
2ae70 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20  /* All keys are 
2ae80 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a  integers */.  }.
2ae90 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2aea0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2aeb0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
2aec0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2aed0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2aee0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2aef0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2af00 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
2af10 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2af20 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2af30 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
2af40 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
2af50 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2af60 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2af70 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2af80 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2af90 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ell>0 );.  if( p
2afa0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2afb0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
2afc0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
2afd0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2afe0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2aff0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b000 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2b010 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ==0 );.    retur
2b020 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2b030 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b040 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
2b050 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74  ey==pCur->curInt
2b060 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2b070 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2b080 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20   || pIdxKey );. 
2b090 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e   for(;;){.    in
2b0a0 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c  t lwr, upr, idx,
2b0b0 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c   c;.    Pgno chl
2b0c0 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
2b0d0 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2b0e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2b0f0 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65  ge];.    u8 *pCe
2b100 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2b110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b120 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
2b130 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
2b140 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67   */..    /* pPag
2b150 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65  e->nCell must be
2b160 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
2b170 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ro. If this is t
2b180 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
2b190 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77   ** the cursor w
2b1a0 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49  ould have been I
2b1b0 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64  NVALID above and
2b1c0 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f   this for(;;) lo
2b1d0 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75  op.    ** not ru
2b1e0 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  n. If this is no
2b1f0 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c  t the root-page,
2b200 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f   then the moveTo
2b210 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a  Child() routine.
2b220 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76      ** would hav
2b230 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74  e already detect
2b240 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e  ed db corruption
2b250 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61  . Similarly, pPa
2b260 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62  ge must.    ** b
2b270 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64  e the right kind
2b280 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65   (index or table
2b290 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65  ) of b-tree page
2b2a0 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20  . Otherwise.    
2b2b0 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  ** a moveToChild
2b2c0 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74  () or moveToRoot
2b2d0 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61  () call would ha
2b2e0 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72  ve detected corr
2b2f0 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
2b300 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2b310 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73  Cell>0 );.    as
2b320 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2b330 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30  Key==(pIdxKey==0
2b340 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30  ) );.    lwr = 0
2b350 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
2b360 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
2b370 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68  assert( biasRigh
2b380 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68  t==0 || biasRigh
2b390 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20  t==1 );.    idx 
2b3a0 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69  = upr>>(1-biasRi
2b3b0 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62  ght); /* idx = b
2b3c0 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a  iasRight ? upr :
2b3d0 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f   (lwr+upr)/2; */
2b3e0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2b3f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2b400 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66  (u16)idx;.    if
2b410 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  ( xRecordCompare
2b420 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2b430 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36  (;;){.        i6
2b440 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
2b450 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2b460 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2b470 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20  e, idx);.       
2b480 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
2b490 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  eyLeaf ){.      
2b4a0 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20      while( 0x80 
2b4b0 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b  <= *(pCell++) ){
2b4c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2b4d0 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61   pCell>=pPage->a
2b4e0 44 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e  DataEnd ) return
2b4f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b500 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2b510 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b520 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
2b530 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
2b540 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
2b550 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
2b560 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2b570 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2b580 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75         if( lwr>u
2b590 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72  pr ){ c = -1; br
2b5a0 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d  eak; }.        }
2b5b0 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65  else if( nCellKe
2b5c0 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  y>intKey ){.    
2b5d0 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d        upr = idx-
2b5e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  1;.          if(
2b5f0 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20   lwr>upr ){ c = 
2b600 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20  +1; break; }.   
2b610 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b620 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2b630 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
2b640 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2b650 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2b660 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
2b670 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2b680 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2b690 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
2b6a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2b6b0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2b6c0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  x;.          if(
2b6d0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2b6e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72  .            lwr
2b6f0 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
2b700 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2b710 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20  next_layer;.    
2b720 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b730 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
2b740 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2b750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b760 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2b770 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
2b780 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b790 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
2b7a0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2b7b0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2b7c0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2b7d0 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2b7e0 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20  pr)/2; */.      
2b7f0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2b800 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
2b810 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20      int nCell;  
2b820 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
2b830 43 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74  Cell cell in byt
2b840 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43  es */.        pC
2b850 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2b860 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2b870 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
2b880 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f  he maximum suppo
2b890 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69  rted page-size i
2b8a0 73 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54  s 65536 bytes. T
2b8b0 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20  his means that. 
2b8c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61         ** the ma
2b8d0 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
2b8e0 72 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f  record bytes sto
2b8f0 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20  red on an index 
2b900 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a  B-Tree.        *
2b910 2a 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74  * page is less t
2b920 68 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20  han 16384 bytes 
2b930 61 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65  and may be store
2b940 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20  d as a 2-byte.  
2b950 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e        ** varint.
2b960 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
2b970 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74  n is used to att
2b980 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61  empt to avoid pa
2b990 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a  rsing .        *
2b9a0 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c  * the entire cel
2b9b0 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f  l by checking fo
2b9c0 72 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72  r the cases wher
2b9d0 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  e the record is 
2b9e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
2b9f0 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68  ed entirely with
2ba00 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  in the b-tree pa
2ba10 67 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67  ge by inspecting
2ba20 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
2ba30 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f      ** 2 bytes o
2ba40 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20  f the cell..    
2ba50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e      */.        n
2ba60 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b  Cell = pCell[0];
2ba70 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
2ba80 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62  ll<=pPage->max1b
2ba90 79 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  ytePayload ){.  
2baa0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2bab0 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74  branch runs if t
2bac0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
2bad0 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c  ield of the cell
2bae0 20 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20   is a.          
2baf0 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76  ** single byte v
2bb00 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
2bb10 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65  cord fits entire
2bb20 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20  ly on the main. 
2bb30 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72           ** b-tr
2bb40 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2bb50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2bb60 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d   pCell+nCell+1==
2bb70 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2bb80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2bb90 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2bba0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2bbb0 43 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79  Cell[1], pIdxKey
2bbc0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2bbd0 20 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20   if( !(pCell[1] 
2bbe0 26 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20  & 0x80) .       
2bbf0 20 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28     && (nCell = (
2bc00 28 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29  (nCell&0x7f)<<7)
2bc10 20 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50   + pCell[1])<=pP
2bc20 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20  age->maxLocal.  
2bc30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2bc40 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2bc50 2d 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61  -size field is a
2bc60 20 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61   2 byte varint a
2bc70 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20  nd the record . 
2bc80 20 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73           ** fits
2bc90 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
2bca0 20 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67   main b-tree pag
2bcb0 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  e.  */.         
2bcc0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
2bcd0 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d  +nCell+2==pPage-
2bce0 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20  >aDataEnd );.   
2bcf0 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2bd00 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2bd10 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32   (void*)&pCell[2
2bd20 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  ], pIdxKey);.   
2bd30 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bd40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63        /* The rec
2bd50 6f 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f  ord flows over o
2bd60 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  nto one or more 
2bd70 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
2bd80 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  In.          ** 
2bd90 74 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68  this case the wh
2bda0 6f 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74  ole cell needs t
2bdb0 6f 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62  o be parsed, a b
2bdc0 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  uffer allocated.
2bdd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
2bde0 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29   accessPayload()
2bdf0 20 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76   used to retriev
2be00 65 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74  e the record int
2be10 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  o the.          
2be20 2a 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  ** buffer before
2be30 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   VdbeRecordCompa
2be40 72 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c  re() can be call
2be50 65 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ed. .          *
2be60 2a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  *.          ** I
2be70 66 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20  f the record is 
2be80 63 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65  corrupt, the xRe
2be90 63 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74  cordCompare rout
2bea0 69 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20  ine may read.   
2beb0 20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20         ** up to 
2bec0 74 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74  two varints past
2bed0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2bee0 62 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61  buffer. An extra
2bef0 20 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a   18 .          *
2bf00 2a 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69  * bytes of paddi
2bf10 6e 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ng is allocated 
2bf20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
2bf30 65 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20  e buffer in.    
2bf40 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68        ** case th
2bf50 69 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a  is happens.  */.
2bf60 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a            void *
2bf70 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  pCellKey;.      
2bf80 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70      u8 * const p
2bf90 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c  CellBody = pCell
2bfa0 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   - pPage->childP
2bfb0 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  trSize;.        
2bfc0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
2bfd0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
2bfe0 42 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66  Body, &pCur->inf
2bff0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  o);.          nC
2c000 65 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d  ell = (int)pCur-
2c010 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20  >info.nKey;.    
2c020 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2c030 6e 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20  nCell<0 );   /* 
2c040 54 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65  True if key size
2c050 20 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65   is 2^32 or more
2c060 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2c070 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30  stcase( nCell==0
2c080 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20   );  /* Invalid 
2c090 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20  key size:  0x80 
2c0a0 30 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20  0x80 0x00 */.   
2c0b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2c0c0 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a   nCell==1 );  /*
2c0d0 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2c0e0 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2c0f0 30 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  01 */.          
2c100 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2c110 3d 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  =2 );  /* Minimu
2c120 6d 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65  m legal index ke
2c130 79 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  y size */.      
2c140 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20      if( nCell<2 
2c150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
2c160 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2c170 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2c180 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2c190 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2c1a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2c1b0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
2c1c0 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31  3Malloc( nCell+1
2c1d0 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8 );.          i
2c1e0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
2c1f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2c200 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2c210 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2c220 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c230 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c240 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2c250 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2c260 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2c270 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
2c280 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
2c290 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
2c2a0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
2c2b0 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
2c2c0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2c2d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c2e0 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2c2f0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c300 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c320 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2c330 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2c340 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2c350 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2c360 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2c370 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2c380 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2c390 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2c3a0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2c3b0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2c3c0 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2c3d0 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2c3e0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2c3f0 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2c400 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2c410 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2c420 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2c430 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2c440 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2c450 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2c460 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2c470 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2c480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c490 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2c4a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2c4b0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2c4c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c4d0 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2c4e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c4f0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2c500 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c510 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2c520 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2c530 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2c540 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c550 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2c560 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2c570 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2c580 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2c590 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2c5a0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2c5b0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2c5c0 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2c5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c5e0 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2c5f0 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2c600 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2c610 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2c620 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2c630 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2c640 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c650 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2c660 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c670 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
2c680 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2c690 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
2c6a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c6b0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2c6c0 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
2c6d0 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
2c6e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c6f0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c700 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
2c710 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
2c720 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
2c730 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2c740 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2c750 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2c760 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2c770 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
2c780 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
2c790 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2c7a0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
2c7b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2c7c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2c7d0 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
2c7e0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2c7f0 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
2c800 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
2c810 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
2c820 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
2c830 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2c840 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2c850 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2c860 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2c870 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75  lidOvfl);.  retu
2c880 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2c890 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2c8a0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
2c8b0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2c8c0 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
2c8d0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
2c8e0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
2c8f0 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
2c900 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c910 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
2c920 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
2c930 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
2c940 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2c950 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
2c960 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
2c970 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
2c980 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2c990 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
2c9a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2c9b0 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
2c9c0 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
2c9d0 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
2c9e0 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
2c9f0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2ca00 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
2ca10 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
2ca20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
2ca30 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
2ca40 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
2ca50 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
2ca60 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
2ca70 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
2ca80 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
2ca90 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
2caa0 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
2cab0 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
2cac0 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
2cad0 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
2cae0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2caf0 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
2cb00 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
2cb10 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
2cb20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
2cb30 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
2cb40 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
2cb50 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2cb60 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
2cb70 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
2cb80 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
2cb90 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20   *pRes=1..**.** 
2cba0 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70  The main entry p
2cbb0 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42  oint is sqlite3B
2cbc0 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61  treeNext().  Tha
2cbd0 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74  t routine is opt
2cbe0 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68  imized.** for th
2cbf0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66  e common case of
2cc00 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e   merely incremen
2cc10 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f  ting the cell co
2cc20 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61  unter BtCursor.a
2cc30 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e  iIdx.** to the n
2cc40 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ext cell on the 
2cc50 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
2cc60 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
2cc70 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a  eNext() helper.*
2cc80 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
2cc90 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
2cca0 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
2ccb0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
2ccc0 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65  page or.** to re
2ccd0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
2cce0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2ccf0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  ing function wil
2cd00 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30  l set *pRes to 0
2cd10 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74   or 1.  The init
2cd20 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a  ial *pRes value.
2cd30 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20  ** will be 1 if 
2cd40 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67  the cursor being
2cd50 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70   stepped corresp
2cd60 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2cd70 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74  ndex and.** if t
2cd80 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c  his routine coul
2cd90 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70  d have been skip
2cda0 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20  ped if that SQL 
2cdb0 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a  index had been.*
2cdc0 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  * a unique index
2cdd0 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
2cde0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76   caller will hav
2cdf0 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a  e set *pRes to z
2ce00 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ero..** Zero is 
2ce10 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
2ce20 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65   The btree imple
2ce30 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65  mentation is fre
2ce40 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20  e to use the.** 
2ce50 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2ce60 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f  lue as a hint to
2ce70 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d   improve perform
2ce80 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75  ance, but the cu
2ce90 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20  rrent.** SQLite 
2cea0 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
2ceb0 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28  tion does not. (
2cec0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f  Note that the co
2ced0 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d  mdb2 btree.** im
2cee0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65  plementation doe
2cef0 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c  s use this hint,
2cf00 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74   however.).*/.st
2cf10 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
2cf20 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65  LINE int btreeNe
2cf30 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2cf40 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2cf50 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2cf60 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2cf70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
2cf80 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2cf90 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2cfa0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2cfb0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2cfc0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2cfd0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2cfe0 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a  rt( *pRes==0 );.
2cff0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2d000 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2d010 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2d020 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2d030 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
2d040 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  )==0 );.    rc =
2d050 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
2d060 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
2d070 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d080 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
2d090 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2d0a0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
2d0b0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2d0c0 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  te ){.      *pRe
2d0d0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  s = 1;.      ret
2d0e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d0f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2d100 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
2d110 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2d120 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d130 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2d140 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d150 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
2d160 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2d170 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2d180 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
2d190 6b 69 70 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20  kipNext>0 ){.   
2d1a0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2d1b0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
2d1c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d1d0 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2d1e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2d1f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
2d200 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2d210 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d220 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
2d230 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d240 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2d250 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2d260 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2d270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2d280 73 20 63 6f 72 72 75 70 74 2c 20 69 74 20 69 73  s corrupt, it is
2d290 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
2d2a0 65 20 76 61 6c 75 65 20 6f 66 20 69 64 78 20 0a  e value of idx .
2d2b0 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c    ** to be inval
2d2c0 69 64 20 68 65 72 65 2e 20 54 68 69 73 20 63 61  id here. This ca
2d2d0 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20  n only occur if 
2d2e0 61 20 73 65 63 6f 6e 64 20 63 75 72 73 6f 72 20  a second cursor 
2d2f0 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a 20 74 68  modifies.  ** th
2d300 65 20 70 61 67 65 20 77 68 69 6c 65 20 63 75 72  e page while cur
2d310 73 6f 72 20 70 43 75 72 20 69 73 20 68 6f 6c 64  sor pCur is hold
2d320 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63 65 20  ing a reference 
2d330 74 6f 20 69 74 2e 20 57 68 69 63 68 20 63 61 6e  to it. Which can
2d340 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65  .  ** only happe
2d350 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  n if the databas
2d360 65 20 69 73 20 63 6f 72 72 75 70 74 20 69 6e 20  e is corrupt in 
2d370 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 6f  such a way as to
2d380 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70   link the.  ** p
2d390 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68  age into more th
2d3a0 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65 20 73 74  an one b-tree st
2d3b0 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65  ructure. */.  te
2d3c0 73 74 63 61 73 65 28 20 69 64 78 3e 70 50 61 67  stcase( idx>pPag
2d3d0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69  e->nCell );..  i
2d3e0 66 28 20 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e  f( idx>=pPage->n
2d3f0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  Cell ){.    if( 
2d400 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2d410 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
2d420 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2d430 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2d440 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2d450 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20  fset+8]));.     
2d460 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2d470 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
2d480 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2d490 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2d4a0 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 66 28 20    do{.      if( 
2d4b0 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2d4c0 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  {.        *pRes 
2d4d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
2d4e0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2d4f0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2d500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d510 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2d520 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
2d530 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
2d540 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d550 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d560 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
2d570 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d580 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
2d590 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ell );.    if( p
2d5a0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
2d5b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
2d5c0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43  ite3BtreeNext(pC
2d5d0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
2d5e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
2d5f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d600 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
2d610 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d620 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d630 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2d640 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2d650 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2d660 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2d670 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2d680 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2d690 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  s){.  MemPage *p
2d6a0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2d6b0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2d6c0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2d6d0 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2d6e0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2d6f0 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2d700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d710 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2d720 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2d730 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2d740 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2d750 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2d760 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2d770 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2d780 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2d790 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66 28  *pRes = 0;.  if(
2d7a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2d7b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65  URSOR_VALID ) re
2d7c0 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2d7d0 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 70 50  Cur, pRes);.  pP
2d7e0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d7f0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d800 0a 20 20 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e  .  if( (++pCur->
2d810 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2d820 65 5d 29 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  e])>=pPage->nCel
2d830 6c 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61  l ){.    pCur->a
2d840 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d850 5d 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]--;.    return 
2d860 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  btreeNext(pCur, 
2d870 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  pRes);.  }.  if(
2d880 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
2d890 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d8a0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
2d8b0 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2d8c0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2d8d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65    }.}../*.** Ste
2d8e0 70 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  p the cursor to 
2d8f0 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  the back to the 
2d900 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
2d910 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2d920 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75   If.** successfu
2d930 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73  l then set *pRes
2d940 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  =0.  If the curs
2d950 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64  or.** was alread
2d960 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  y pointing to th
2d970 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
2d980 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
2d990 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
2d9a0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
2d9b0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
2d9c0 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  1..**.** The mai
2d9d0 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
2d9e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
2d9f0 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
2da00 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2da10 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2da20 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2da30 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
2da40 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2da50 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2da60 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
2da70 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
2da80 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2da90 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2daa0 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
2dab0 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
2dac0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2dad0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2dae0 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2daf0 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
2db00 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2db10 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2db20 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2db30 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2db40 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2db50 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2db60 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2db70 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2db80 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2db90 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2dba0 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2dbb0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2dbc0 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2dbd0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2dbe0 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2dbf0 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2dc00 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2dc10 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2dc20 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2dc30 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2dc40 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2dc50 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2dc60 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2dc70 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2dc80 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2dc90 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2dca0 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2dcb0 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2dcc0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2dcd0 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2dce0 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2dcf0 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2dd00 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2dd10 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2dd20 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2dd30 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2dd40 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2dd50 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2dd60 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2dd70 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2dd80 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2dd90 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2dda0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2ddb0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2ddc0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2ddd0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2dde0 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2ddf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2de00 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
2de10 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
2de20 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2de30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2de40 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
2de50 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
2de60 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
2de70 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
2de80 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2de90 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2dea0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2deb0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2dec0 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
2ded0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
2dee0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
2def0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2df00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
2df10 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2df20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2df30 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2df40 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  e ){.      *pRes
2df50 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
2df60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2df70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2df80 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20  ->skipNext ){.  
2df90 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2dfa0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2dfb0 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
2dfc0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
2dfd0 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20  KIPNEXT );.     
2dfe0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2dff0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
2e000 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2e010 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20 20  ipNext<0 ){.    
2e020 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2e030 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
2e040 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2e050 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e060 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2e070 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
2e080 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e090 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e0a0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2e0b0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2e0c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2e0d0 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
2e0e0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
2e0f0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2e100 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2e110 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2e120 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2e130 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
2e140 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2e150 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2e160 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2e170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
2e180 69 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ile( pCur->aiIdx
2e190 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30  [pCur->iPage]==0
2e1a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
2e1b0 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
2e1c0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2e1d0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2e1e0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
2e1f0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2e200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e210 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2e220 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70    moveToParent(p
2e230 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2e240 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2e250 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2e260 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2e270 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54  ->curFlags & (BT
2e280 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2e290 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30  F_ValidOvfl))==0
2e2a0 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61   );..    pCur->a
2e2b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e2c0 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  ]--;.    pPage =
2e2d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e2e0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2e2f0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2e300 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2e310 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2e320 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2e330 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29  ious(pCur, pRes)
2e340 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e350 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2e360 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
2e370 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
2e380 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
2e390 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2e3a0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2e3b0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2e3c0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2e3d0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2e3e0 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2e3f0 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c  sert( *pRes==0 |
2e400 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20  | *pRes==1 );.  
2e410 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2e420 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2e430 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e440 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52  R_VALID );.  *pR
2e450 65 73 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  es = 0;.  pCur->
2e460 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2e470 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2e480 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61  alidOvfl|BTCF_Va
2e490 6c 69 64 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72  lidNKey);.  pCur
2e4a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2e4b0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
2e4c0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2e4d0 49 44 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61  ID.   || pCur->a
2e4e0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e4f0 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d  ]==0.   || pCur-
2e500 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2e510 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20  age]->leaf==0.  
2e520 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
2e530 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2e540 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70  , pRes);.  }.  p
2e550 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e560 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74  >iPage]--;.  ret
2e570 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2e580 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
2e590 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
2e5a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e5b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
2e5c0 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
2e5d0 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
2e5e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
2e5f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2e600 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
2e610 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
2e620 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
2e630 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
2e640 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
2e650 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
2e660 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
2e670 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
2e680 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
2e690 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2e6a0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
2e6b0 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
2e6c0 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
2e6d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
2e6e0 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
2e6f0 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
2e700 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
2e710 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
2e720 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
2e730 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  L in the event o
2e740 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  f an error..**.*
2e750 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
2e760 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
2e770 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
2e780 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
2e790 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
2e7a0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
2e7b0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
2e7c0 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
2e7d0 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
2e7e0 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
2e7f0 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
2e800 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
2e810 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
2e820 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
2e830 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
2e840 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
2e850 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
2e860 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
2e870 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
2e880 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
2e890 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
2e8a0 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
2e8b0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
2e8c0 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
2e8d0 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
2e8e0 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
2e8f0 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
2e900 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
2e910 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
2e920 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
2e930 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
2e940 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
2e950 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
2e960 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
2e970 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
2e980 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
2e990 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
2e9a0 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
2e9b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
2e9c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2e9d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2e9e0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
2e9f0 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
2ea00 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
2ea10 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
2ea20 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
2ea30 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
2ea40 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
2ea50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
2ea60 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
2ea70 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
2ea80 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
2ea90 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
2eaa0 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
2eab0 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
2eac0 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
2ead0 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
2eae0 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
2eaf0 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
2eb00 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
2eb10 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
2eb20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
2eb30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2eb40 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2eb50 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
2eb60 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2eb70 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
2eb80 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
2eb90 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
2eba0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
2ebb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
2ebc0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
2ebd0 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
2ebe0 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
2ebf0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2ec00 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2ec10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ec20 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2ec30 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
2ec40 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
2ec50 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e  (nearby>0 && IfN
2ec60 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75  otOmitAV(pBt->au
2ec70 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20  toVacuum)) );.  
2ec80 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
2ec90 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
2eca0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
2ecb0 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  pBt);.  /* EVIDE
2ecc0 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d  NCE-OF: R-05119-
2ecd0 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65  02637 The 4-byte
2ece0 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
2ecf0 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36  ger at offset 36
2ed00 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f  .  ** stores sto
2ed10 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  res the total nu
2ed20 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
2ed30 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a   the freelist. *
2ed40 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  /.  n = get4byte
2ed50 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
2ed60 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
2ed70 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
2ed80 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
2ed90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2eda0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2edb0 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
2edc0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
2edd0 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
2ede0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
2edf0 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
2ee00 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
2ee10 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
2ee20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
2ee30 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
2ee40 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
2ee50 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
2ee60 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
2ee70 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
2ee80 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
2ee90 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
2eea0 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
2eeb0 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
2eec0 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
2eed0 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
2eee0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
2eef0 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
2ef00 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
2ef10 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
2ef20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
2ef30 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
2ef40 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
2ef50 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
2ef60 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
2ef70 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
2ef80 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
2ef90 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64  UUM.    if( eMod
2efa0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
2efb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
2efc0 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
2efd0 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
2efe0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2eff0 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
2f000 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
2f010 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
2f020 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2f030 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
2f040 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
2f050 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2f060 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2f070 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
2f080 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2f090 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61  ){.          sea
2f0a0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
2f0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f0c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f     }else if( eMo
2f0d0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
2f0e0 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69  {.      searchLi
2f0f0 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  st = 1;.    }.#e
2f100 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
2f110 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
2f120 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
2f130 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
2f140 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
2f150 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
2f160 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
2f170 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
2f180 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
2f190 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
2f1a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f1b0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
2f1c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
2f1d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
2f1e0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2f1f0 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
2f200 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
2f210 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
2f220 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
2f230 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
2f240 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
2f250 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
2f260 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
2f270 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
2f280 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
2f290 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
2f2a0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
2f2b0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
2f2c0 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
2f2d0 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
2f2e0 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
2f2f0 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
2f300 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
2f310 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
2f320 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
2f330 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
2f340 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
2f350 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
2f360 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
2f370 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
2f380 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31  CE-OF: R-01506-1
2f390 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69  1053 The first i
2f3a0 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
2f3b0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
2f3c0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68          ** is th
2f3d0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2f3e0 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69   the next freeli
2f3f0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
2f400 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20   the list or.   
2f410 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20       ** zero if 
2f420 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74  this is the last
2f430 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2f440 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
2f450 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
2f460 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
2f470 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
2f480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f490 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2f4a0 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68  R-59841-13798 Th
2f4b0 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
2f4c0 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
2f4d0 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20  ffset 32.       
2f4e0 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70   ** stores the p
2f4f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2f500 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
2f510 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72  the freelist, or
2f520 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20   zero if.       
2f530 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
2f540 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20   is empty. */.  
2f550 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2f560 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
2f570 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
2f580 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
2f590 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
2f5a0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
2f5b0 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c   iTrunk>mxPage |
2f5c0 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20  | nSearch++ > n 
2f5d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2f5e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2f5f0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
2f600 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62  {.        rc = b
2f610 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
2f620 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
2f630 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
2f640 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2f650 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75   ){.        pTru
2f660 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2f670 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2f680 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a  e_page;.      }.
2f690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2f6a0 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20  runk!=0 );.     
2f6b0 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 2d   assert( pTrunk-
2f6c0 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a 20 20 20  >aData!=0 );.   
2f6d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
2f6e0 46 3a 20 52 2d 31 33 35 32 33 2d 30 34 33 39 34  F: R-13523-04394
2f6f0 20 54 68 65 20 73 65 63 6f 6e 64 20 69 6e 74 65   The second inte
2f700 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2f710 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2f720 20 20 20 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d     ** is the num
2f730 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
2f740 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c   pointers to fol
2f750 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20  low. */.      k 
2f760 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75  = get4byte(&pTru
2f770 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20  nk->aData[4]);. 
2f780 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26       if( k==0 &&
2f790 20 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a   !searchList ){.
2f7a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2f7b0 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76  runk has no leav
2f7c0 65 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20  es and the list 
2f7d0 69 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61  is not being sea
2f7e0 72 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20  rched. .        
2f7f0 2a 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68  ** So extract th
2f800 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73  e trunk page its
2f810 65 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61  elf and use it a
2f820 73 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20  s the newly .   
2f830 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2f840 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  d page */.      
2f850 20 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54    assert( pPrevT
2f860 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  runk==0 );.     
2f870 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2f880 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
2f890 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f8a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2f8b0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2f8c0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2f8d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f8e0 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2f8f0 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  k;.        memcp
2f900 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2f910 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2f920 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2f930 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2f940 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70  Trunk;.        p
2f950 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
2f960 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
2f970 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20  ATE: %d trunk - 
2f980 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65  %d free pages le
2f990 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e  ft\n", *pPgno, n
2f9a0 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  -1));.      }els
2f9b0 65 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42  e if( k>(u32)(pB
2f9c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
2f9d0 2d 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  - 2) ){.        
2f9e0 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73  /* Value of k is
2f9f0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20   out of range.  
2fa00 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
2fa10 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  ion */.        r
2fa20 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2fa30 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2fa40 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2fa50 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
2fa60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2fa70 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
2fa80 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
2fa90 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
2faa0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
2fab0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
2fac0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
2fad0 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
2fae0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
2faf0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
2fb00 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
2fb10 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
2fb20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
2fb30 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
2fb40 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
2fb50 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
2fb60 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
2fb70 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
2fb80 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
2fb90 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
2fba0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
2fbb0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
2fbc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2fbd0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2fbe0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2fbf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2fc00 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2fc10 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2fc20 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2fc30 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
2fc40 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2fc50 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
2fc60 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
2fc70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
2fc80 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
2fc90 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2fca0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fcb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2fcc0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fcd0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
2fce0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2fcf0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2fd00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fd10 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fd20 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fd30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fd40 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2fd50 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
2fd60 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
2fd70 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
2fd80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fd90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2fda0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
2fdb0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
2fdc0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
2fdd0 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
2fde0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
2fdf0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
2fe00 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
2fe10 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
2fe20 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
2fe30 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
2fe40 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
2fe50 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2fe60 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
2fe70 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
2fe80 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
2fe90 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2fea0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
2feb0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
2fec0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
2fed0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2fee0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2fef0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2ff00 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2ff10 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2ff20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
2ff30 65 73 74 63 61 73 65 28 20 69 4e 65 77 54 72 75  estcase( iNewTru
2ff40 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
2ff50 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
2ff60 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
2ff70 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20  pBt, iNewTrunk, 
2ff80 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a  &pNewTrunk, 0);.
2ff90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2ffa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ffb0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2ffc0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2ffd0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2ffe0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2fff0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30000 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61  pNewTrunk->pDbPa
30010 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
30020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30040 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
30050 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
30060 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
30070 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
30080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30090 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
300a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26  unk->aData[0], &
300b0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  pTrunk->aData[0]
300c0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
300d0 70 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72  put4byte(&pNewTr
300e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b  unk->aData[4], k
300f0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  -1);.          m
30100 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
30110 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72  ->aData[8], &pTr
30120 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20  unk->aData[12], 
30130 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20  (k-1)*4);.      
30140 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30150 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
30160 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
30170 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
30180 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
30190 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
301a0 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62  able(pPage1->pDb
301b0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
301c0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
301d0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
301e0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
301f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30200 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
30210 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30220 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44  e(pPrevTrunk->pD
30230 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
30240 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
30250 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
30260 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
30270 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
30280 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  }.            pu
30290 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
302a0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e  nk->aData[0], iN
302b0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
302c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
302d0 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
302e0 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43   0;.        TRAC
302f0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
30300 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65   trunk - %d free
30310 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20   pages left\n", 
30320 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23  *pPgno, n-1));.#
30330 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
30340 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20  e if( k>0 ){.   
30350 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20       /* Extract 
30360 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20  a leaf from the 
30370 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20  trunk */.       
30380 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20   u32 closest;.  
30390 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65        Pgno iPage
303a0 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  ;.        unsign
303b0 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d  ed char *aData =
303c0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a   pTrunk->aData;.
303d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
303e0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
303f0 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20    u32 i;.       
30400 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
30410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 4d            if( eM
30420 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20  ode==BTALLOC_LE 
30430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
30440 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=0; i<k; i++
30450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30460 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
30470 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
30480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
30490 69 66 28 20 69 50 61 67 65 3c 3d 6e 65 61 72 62  if( iPage<=nearb
304a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
304b0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
304c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
304d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
304e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
304f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30500 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30510 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
30520 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
30530 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
30540 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
30550 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  [8]) - nearby);.
30560 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
30570 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
30590 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 41 62  t d2 = sqlite3Ab
305a0 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
305b0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
305c0 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
305d0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
305e0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
305f0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
30600 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
30610 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
30620 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
30630 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30660 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
30670 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
30680 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
30690 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
306a0 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
306b0 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65   testcase( iPage
306c0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
306d0 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78      if( iPage>mx
306e0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
306f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
30700 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
30710 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
30720 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
30730 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30740 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
30750 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
30760 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
30770 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
30780 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
30790 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
307a0 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
307b0 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
307c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
307d0 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
307e0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
307f0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
30800 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
30810 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
30820 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
30830 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
30840 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
30850 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
30860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30870 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
30880 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
30890 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
308a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
308b0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
308c0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
308d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
308e0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
308f0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30900 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
30910 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
30920 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
30930 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
30940 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
30950 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30960 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
30970 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
30980 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
30990 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
309a0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
309b0 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
309c0 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
309d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
309e0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
309f0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
30a00 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
30a10 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
30a20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
30a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30a40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30a50 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
30a60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30a70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
30a80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30a90 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
30aa0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
30ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
30ac0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
30ad0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30af0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
30b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b10 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
30b20 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
30b30 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
30b40 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
30b50 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
30b60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
30b70 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
30b80 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
30b90 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
30ba0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
30bb0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
30bc0 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
30bd0 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
30be0 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
30bf0 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
30c00 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
30c10 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
30c20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
30c30 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
30c40 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
30c50 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
30c60 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
30c70 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
30c80 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
30c90 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
30ca0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
30cb0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
30cc0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
30cd0 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
30ce0 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
30cf0 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
30d00 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
30d10 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
30d20 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
30d30 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
30d40 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
30d50 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
30d60 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
30d70 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
30d80 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
30d90 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
30da0 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
30db0 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
30dc0 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
30dd0 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
30de0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
30df0 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
30e00 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
30e10 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
30e20 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
30e30 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
30e40 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
30e50 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
30e60 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
30e70 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
30e80 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
30e90 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
30ea0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
30eb0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
30ec0 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
30ed0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
30ee0 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
30ef0 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
30f00 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
30f10 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
30f20 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
30f30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
30f40 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
30f50 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
30f60 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
30f70 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
30f80 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
30f90 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
30fa0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
30fb0 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
30fc0 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
30fd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30fe0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
30ff0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
31000 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
31010 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
31020 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
31030 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
31040 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
31050 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
31060 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
31070 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31080 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
31090 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
310a0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
310b0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
310c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
310d0 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
310e0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
310f0 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
31100 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
31110 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
31120 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
31130 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
31140 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
31150 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
31160 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
31170 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
31180 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
31190 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
311a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
311b0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
311c0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
311d0 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
311e0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
311f0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
31200 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
31210 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
31220 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
31230 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
31240 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
31250 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
31260 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
31270 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
31280 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
31290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
312a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
312b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
312c0 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
312d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
312e0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
312f0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
31300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31310 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
31320 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
31330 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
31340 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
31350 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
31360 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
31370 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
31380 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
31390 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
313a0 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
313b0 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
313c0 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
313d0 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
313e0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
313f0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
31400 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
31410 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
31420 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
31430 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
31440 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
31450 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
31460 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
31470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31490 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
314a0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
314b0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
314c0 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
314d0 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
314e0 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
314f0 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
31500 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
31510 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31520 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
31530 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
31540 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
31550 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
31560 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
31570 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
31580 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
31590 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
315a0 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
315b0 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
315c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
315d0 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
315e0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
315f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
31600 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
31610 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
31620 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
31630 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
31640 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
31650 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
31660 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
31670 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
31680 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
31690 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
316a0 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
316b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
316c0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
316d0 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
316e0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
316f0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
31700 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
31710 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
31720 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
31730 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
31740 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
31750 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
31760 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
31770 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
31780 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
31790 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
317a0 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
317b0 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
317c0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
317d0 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
317e0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
317f0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
31800 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
31810 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
31820 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
31830 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
31840 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
31850 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
31860 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31880 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
31890 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
318a0 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
318c0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
318d0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
318e0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
318f0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
31900 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
31910 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
31920 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
31930 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31940 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31950 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
31960 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
31970 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
31980 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
31990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319a0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
319b0 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
319c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
319e0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
319f0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
31a00 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
31a10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
31a20 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
31a30 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
31a40 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
31a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
31a60 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
31a70 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
31a80 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
31a90 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
31aa0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
31ab0 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
31ac0 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
31ad0 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
31ae0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
31af0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
31b00 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
31b10 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
31b20 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
31b30 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
31b40 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
31b50 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
31b60 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
31b70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31b80 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
31b90 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
31ba0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
31bb0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
31bc0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31bd0 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
31be0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31bf0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
31c00 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
31c10 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
31c20 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
31c30 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
31c40 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
31c50 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
31c60 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
31c70 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
31c80 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
31c90 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
31ca0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
31cb0 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
31cc0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
31cd0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
31ce0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
31cf0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
31d00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31d10 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
31d20 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
31d30 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
31d40 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
31d50 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
31d60 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
31d70 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
31d80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
31d90 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
31da0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
31db0 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
31dc0 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
31dd0 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
31de0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
31df0 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
31e00 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
31e10 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
31e20 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
31e30 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
31e40 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
31e50 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
31e60 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
31e70 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
31e80 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
31e90 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
31ea0 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
31eb0 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
31ec0 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
31ed0 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
31ee0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
31ef0 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
31f00 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
31f10 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
31f20 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
31f30 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
31f40 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
31f50 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
31f60 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
31f70 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
31f80 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
31f90 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
31fa0 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
31fb0 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
31fc0 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
31fd0 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
31fe0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
31ff0 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
32000 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
32010 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
32020 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
32030 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
32040 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
32050 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
32060 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
32070 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
32080 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
32090 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
320a0 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
320b0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
320c0 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
320d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
320e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
320f0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
32100 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
32110 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
32120 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
32130 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
32140 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
32150 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
32160 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
32170 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
32180 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
32190 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
321a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
321b0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
321c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
321d0 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
321e0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
321f0 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
32200 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
32210 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
32220 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
32230 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
32240 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
32250 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
32260 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
32270 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
32280 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
32290 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
322a0 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
322b0 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
322c0 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
322d0 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
322e0 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
322f0 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
32300 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
32310 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
32320 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
32330 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
32340 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
32350 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
32360 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
32370 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
32380 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
32390 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
323a0 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
323b0 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
323c0 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
323d0 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
323e0 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
323f0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
32400 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
32410 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
32420 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
32430 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
32440 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
32450 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
32460 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
32470 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
32480 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
32490 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
324a0 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
324b0 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
324c0 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
324d0 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
324e0 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
324f0 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
32500 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
32510 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
32520 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
32530 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
32540 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
32550 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
32560 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
32570 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
32580 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
32590 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
325a0 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
325b0 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
325c0 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
325d0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
325e0 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
325f0 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
32600 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
32610 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
32620 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
32630 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
32640 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
32650 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
32660 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
32670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32680 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
32690 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
326a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
326b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
326c0 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
326d0 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
326e0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
326f0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
32700 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
32710 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
32720 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
32730 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
32740 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
32750 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
32760 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
32770 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
32780 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32790 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
327a0 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
327b0 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
327c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
327d0 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
327e0 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
327f0 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
32800 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
32810 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
32820 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
32830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
32840 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
32850 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
32860 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
32870 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
32880 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
32890 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
328a0 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
328b0 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
328c0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
328d0 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
328e0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
328f0 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
32900 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
32910 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
32920 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
32930 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
32940 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
32950 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
32960 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
32970 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
32980 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
32990 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
329a0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
329b0 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
329c0 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
329d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
329e0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
329f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
32a00 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
32a10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32a20 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
32a30 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
32a40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32a50 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
32a60 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
32a70 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
32a80 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
32a90 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
32aa0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
32ab0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
32ac0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
32ad0 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
32ae0 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
32af0 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
32b00 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
32b10 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
32b20 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
32b30 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
32b40 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
32b50 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
32b60 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
32b70 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
32b80 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
32b90 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
32ba0 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
32bb0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
32bc0 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
32bd0 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
32be0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
32bf0 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
32c00 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
32c10 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
32c20 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
32c30 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
32c40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
32c50 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57  e given Cell.  W
32c60 72 69 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61  rite the.** loca
32c70 6c 20 43 65 6c 6c 20 73 69 7a 65 20 28 74 68 65  l Cell size (the
32c80 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
32c90 20 6f 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   on the original
32ca0 20 70 61 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a   page, omitting.
32cb0 2a 2a 20 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74  ** overflow) int
32cc0 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74  o *pnSize..*/.st
32cd0 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65  atic int clearCe
32ce0 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
32cf0 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
32d00 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
32d10 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 65 6c  contains the Cel
32d20 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
32d30 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
32d40 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
32d50 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75   the Cell */.  u
32d60 31 36 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  16 *pnSize      
32d70 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
32d80 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
32d90 20 43 65 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b   Cell here */.){
32da0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
32db0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
32dc0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
32dd0 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b    Pgno ovflPgno;
32de0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
32df0 20 6e 4f 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76   nOvfl;.  u32 ov
32e00 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61  flPageSize;..  a
32e10 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
32e20 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
32e30 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
32e40 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
32e50 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
32e60 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53  , &info);.  *pnS
32e70 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
32e80 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
32e90 63 61 6c 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  cal==info.nPaylo
32ea0 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ad ){.    return
32eb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
32ec0 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
32ed0 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
32ee0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
32ef0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43   */.  }.  if( pC
32f00 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31  ell+info.nSize-1
32f10 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
32f20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
32f30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32f40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32f50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
32f60 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
32f70 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
32f80 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
32f90 65 28 70 43 65 6c 6c 20 2b 20 69 6e 66 6f 2e 6e  e(pCell + info.n
32fa0 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 61 73 73  Size - 4);.  ass
32fb0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
32fc0 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
32fd0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
32fe0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
32ff0 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
33000 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
33010 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
33020 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
33030 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
33040 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20  ert( nOvfl>0 || 
33050 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42  .    (CORRUPT_DB
33060 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f   && (info.nPaylo
33070 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  ad + ovflPageSiz
33080 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29  e)<ovflPageSize)
33090 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  .  );.  while( n
330a0 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
330b0 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
330c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
330d0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
330e0 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
330f0 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
33100 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
33110 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
33120 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
33130 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
33140 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
33150 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
33160 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
33170 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
33180 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
33190 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
331a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
331b0 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
331c0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
331d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
331e0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
331f0 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
33200 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
33210 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
33220 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
33230 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
33240 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
33250 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
33260 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
33270 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
33280 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
33290 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
332a0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
332b0 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
332c0 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
332d0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
332e0 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
332f0 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
33300 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
33310 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
33320 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
33330 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
33340 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
33350 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
33360 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
33370 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
33380 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
33390 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
333a0 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
333b0 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
333c0 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
333d0 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
333e0 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
333f0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
33400 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
33410 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
33420 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
33430 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
33440 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
33450 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
33460 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
33470 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
33480 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
33490 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
334a0 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
334b0 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
334c0 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
334d0 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
334e0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
334f0 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
33500 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
33510 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
33520 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
33530 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
33540 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
33550 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
33560 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
33570 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33580 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
33590 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
335a0 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
335b0 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
335c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
335d0 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
335e0 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
335f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
33600 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
33610 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
33620 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33630 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
33640 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
33650 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
33660 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
33670 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
33680 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
33690 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
336a0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
336b0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
336c0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
336d0 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
336e0 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
336f0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
33700 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
33710 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
33720 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
33730 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
33740 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
33750 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
33760 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
33770 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
33780 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
33790 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
337a0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
337b0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
337c0 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
337d0 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
337e0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
337f0 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
33800 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
33810 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
33820 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
33830 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
33840 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
33850 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
33860 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
33870 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
33880 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
33890 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
338a0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
338b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
338c0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
338d0 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
338e0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
338f0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
33900 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
33910 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
33920 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
33930 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
33940 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
33950 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
33960 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
33970 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
33980 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
33990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339a0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
339b0 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
339c0 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
339d0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
339e0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
339f0 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
33a00 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
33a10 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
33a20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
33a30 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
33a40 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
33a50 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
33a60 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
33a70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
33a80 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
33a90 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
33aa0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a    int nHeader;..
33ab0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33ac0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
33ad0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
33ae0 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
33af0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
33b00 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
33b10 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
33b20 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
33b30 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
33b40 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
33b50 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
33b60 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
33b70 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
33b80 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
33b90 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
33ba0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
33bb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
33bc0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33bd0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
33be0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
33bf0 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
33c00 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
33c10 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
33c20 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
33c30 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65  ad = nData + nZe
33c40 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ro;.  if( pPage-
33c50 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
33c60 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
33c70 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
33c80 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
33c90 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oad);.  }else{. 
33ca0 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61     assert( nData
33cb0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
33cc0 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20  t( nZero==0 );. 
33cd0 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
33ce0 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
33cf0 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
33d00 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f  *)&nKey);.  .  /
33d10 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
33d20 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20  yload size */.  
33d30 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
33d40 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
33d50 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
33d60 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
33d70 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
33d80 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b   .    assert( nK
33d90 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26  ey<=0x7fffffff &
33da0 26 20 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20  & pKey!=0 );.   
33db0 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74   nPayload = (int
33dc0 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
33dd0 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
33de0 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
33df0 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  }.  if( nPayload
33e00 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
33e10 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65  l ){.    n = nHe
33e20 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b  ader + nPayload;
33e30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
33e40 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==3 );.    testc
33e50 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20  ase( n==4 );.   
33e60 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34   if( n<4 ) n = 4
33e70 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
33e80 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
33e90 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
33ea0 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b   pPrior = pCell;
33eb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
33ec0 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69  t mn = pPage->mi
33ed0 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20  nLocal;.    n = 
33ee0 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  mn + (nPayload -
33ef0 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70   mn) % (pPage->p
33f00 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
33f10 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
33f20 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
33f30 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
33f40 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
33f50 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
33f60 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65     if( n > pPage
33f70 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d  ->maxLocal ) n =
33f80 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65   mn;.    spaceLe
33f90 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53  ft = n;.    *pnS
33fa0 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65  ize = n + nHeade
33fb0 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f  r + 4;.    pPrio
33fc0 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  r = &pCell[nHead
33fd0 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  er+n];.  }.  pPa
33fe0 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
33ff0 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41  Header];..  /* A
34000 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72  t this point var
34010 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65  iables should be
34020 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   set as follows:
34030 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61  .  **.  **   nPa
34040 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
34050 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  Total payload si
34060 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a  ze in bytes.  **
34070 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20     pPayload     
34080 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74        Begin writ
34090 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65  ing payload here
340a0 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66  .  **   spaceLef
340b0 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65  t          Space
340c0 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50   available at pP
340d0 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79  ayload.  If nPay
340e0 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a  load>spaceLeft,.
340f0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
34100 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d            that m
34110 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73  eans content mus
34120 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65  t spill into ove
34130 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a  rflow pages..  *
34140 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  *   *pnSize     
34150 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74         Size of t
34160 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e  he local cell (n
34170 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72  ot counting over
34180 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a  flow pages).  **
34190 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20     pPrior       
341a0 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77        Where to w
341b0 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66  rite the pgno of
341c0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
341d0 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20  low page.  **.  
341e0 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f  ** Use a call to
341f0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
34200 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74  tr() to verify t
34210 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61  hat the values a
34220 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63  bove.  ** were c
34230 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c  omputed correctl
34240 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49  y..  */.#if SQLI
34250 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  TE_DEBUG.  {.   
34260 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
34270 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
34280 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
34290 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
342a0 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d  assert( nHeader=
342b0 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c  (int)(info.pPayl
342c0 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a  oad - pCell) );.
342d0 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f      assert( info
342e0 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
342f0 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69     assert( *pnSi
34300 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ze == info.nSize
34310 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
34320 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66  spaceLeft == inf
34330 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a  o.nLocal );.  }.
34340 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69  #endif..  /* Wri
34350 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  te the payload i
34360 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65  nto the local Ce
34370 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61  ll and any extra
34380 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
34390 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ages */.  while(
343a0 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
343b0 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
343c0 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
343d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
343e0 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
343f0 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
34400 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
34410 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
34420 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
34430 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
34440 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
34450 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
34460 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
34470 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
34480 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
34490 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
344a0 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
344b0 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
344c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
344d0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
344e0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
344f0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
34500 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
34510 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
34520 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
34530 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34540 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
34550 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
34560 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
34570 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
34580 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
34590 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
345a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
345b0 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
345c0 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
345d0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
345e0 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
345f0 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
34600 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
34610 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
34620 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
34630 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
34640 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
34650 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
34660 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
34670 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
34680 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
34690 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
346a0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
346b0 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
346c0 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
346d0 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
346e0 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
346f0 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
34700 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
34710 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
34720 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
34730 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
34740 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
34750 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
34760 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
34770 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
34780 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
34790 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
347a0 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
347b0 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
347c0 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
347d0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
347e0 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
347f0 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
34800 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
34810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
34820 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
34830 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34840 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
34850 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
34860 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34870 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34880 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34890 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
348a0 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
348b0 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
348c0 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
348d0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
348e0 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
348f0 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
34900 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
34910 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
34920 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
34930 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
34940 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
34950 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
34960 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
34970 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
34980 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
34990 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
349a0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
349b0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
349c0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
349d0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
349e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
349f0 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
34a00 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
34a10 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
34a20 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
34a30 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
34a40 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34a50 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
34a60 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
34a70 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
34a80 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
34a90 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
34aa0 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
34ab0 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
34ac0 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
34ad0 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
34ae0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
34af0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
34b00 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
34b10 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
34b20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
34b30 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
34b40 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
34b50 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
34b60 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
34b70 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
34b80 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
34b90 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
34ba0 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
34bb0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
34bc0 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
34bd0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
34be0 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
34bf0 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
34c00 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
34c10 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
34c20 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
34c30 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34c40 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
34c50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
34c60 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
34c70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
34c80 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
34c90 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
34ca0 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
34cb0 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
34cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
34cd0 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
34ce0 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
34cf0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
34d00 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
34d10 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
34d20 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34d30 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
34d40 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
34d50 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
34d60 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
34d70 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
34d80 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
34d90 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
34da0 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
34db0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
34dc0 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
34dd0 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
34de0 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
34df0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
34e00 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
34e10 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
34e20 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
34e30 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
34e40 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
34e50 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
34e60 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
34e70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
34e80 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
34e90 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
34ea0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
34eb0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
34ec0 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
34ed0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
34ee0 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
34ef0 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
34f00 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
34f10 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
34f20 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
34f30 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
34f40 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
34f50 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
34f60 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
34f70 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
34f80 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
34f90 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
34fa0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
34fb0 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
34fc0 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
34fd0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
34fe0 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
34ff0 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
35000 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
35010 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
35020 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20  nt *pRC){.  u32 
35030 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
35040 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
35050 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
35060 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
35070 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
35080 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
35090 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
350a0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
350b0 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
350c0 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
350d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
350e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
350f0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
35100 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
35110 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
35120 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
35130 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
35140 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
35150 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
35160 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
35170 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
35180 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
35190 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73   CORRUPT_DB || s
351a0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
351b0 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
351c0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
351d0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
351e0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
351f0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35200 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
35210 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
35220 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
35230 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
35240 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
35250 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
35260 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
35270 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
35280 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
35290 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
352a0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
352b0 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
352c0 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
352d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
352e0 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
352f0 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
35300 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
35310 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
35320 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
35330 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
35340 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
35350 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
35360 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
35370 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
35380 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
35390 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
353a0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
353b0 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66  e->nCell--;.  if
353c0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
353d0 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
353e0 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
353f0 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64   4);.    data[hd
35400 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75  r+7] = 0;.    pu
35410 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
35420 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  +5], pPage->pBt-
35430 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
35440 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
35450 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
35460 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d  bleSize - pPage-
35470 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20  >hdrOffset.     
35480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35490 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64    - pPage->child
354a0 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d  PtrSize - 8;.  }
354b0 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76  else{.    memmov
354c0 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
354d0 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
354e0 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62  idx));.    put2b
354f0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
35500 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
35510 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
35520 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e += 2;.  }.}../
35530 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
35540 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
35550 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
35560 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
35570 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
35580 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
35590 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
355a0 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
355b0 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
355c0 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
355d0 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
355e0 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
355f0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
35600 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35610 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
35620 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
35630 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
35640 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
35650 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
35660 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
35670 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
35680 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
35690 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
356a0 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
356b0 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
356c0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
356d0 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
356e0 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
356f0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
35700 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
35710 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
35720 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
35730 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
35740 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
35750 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
35760 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
35770 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
35780 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
35790 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
357a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
357b0 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
357c0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
357d0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
357e0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
357f0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
35800 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
35810 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
35820 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
35830 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
35840 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
35850 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
35860 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
35870 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
35880 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
35890 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
358a0 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
358b0 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
358c0 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
358d0 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
358e0 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
358f0 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
35900 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
35910 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
35920 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
35930 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
35940 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
35950 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
35960 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
35970 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
35980 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
35990 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
359a0 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
359b0 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20  */.  u8 *pIns;  
359c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
359d0 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  int in pPage->aC
359e0 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e  ellIdx[] where n
359f0 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  o cell inserted 
35a00 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
35a10 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
35a20 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
35a30 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
35a40 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
35a50 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
35a60 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
35a70 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0921 );.  assert
35a80 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
35a90 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
35aa0 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  Bt) || CORRUPT_D
35ab0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
35ac0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
35ad0 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
35ae0 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->apOvfl) );.  a
35af0 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
35b00 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d  (pPage->apOvfl)=
35b10 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
35b20 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->aiOvfl) );.  a
35b30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
35b40 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
35b50 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
35b60 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68    /* The cell sh
35b70 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
35b80 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79   sized correctly
35b90 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
35ba0 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d   moving a.  ** m
35bb0 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72  alformed cell fr
35bc0 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  om a leaf page t
35bd0 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  o an interior pa
35be0 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20  ge, if the cell 
35bf0 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64  size.  ** wanted
35c00 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
35c10 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64   4 but got round
35c20 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68  ed up to 4 on th
35c30 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a  e leaf, then siz
35c40 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  e.  ** might be 
35c50 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61  less than 8 (lea
35c60 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72  f-size + pointer
35c70 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f  ) on the interio
35c80 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20  r node.  Hence. 
35c90 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74   ** the term aft
35ca0 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65  er the || in the
35cb0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
35cc0 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  t(). */.  assert
35cd0 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65  ( sz==pPage->xCe
35ce0 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43  llSize(pPage, pC
35cf0 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
35d00 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
35d10 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
35d20 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
35d30 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
35d40 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
35d50 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
35d60 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  p, pCell, sz);. 
35d70 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
35d80 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
35d90 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
35da0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
35db0 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
35dc0 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
35dd0 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
35de0 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
35df0 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
35e00 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  pOvfl)/sizeof(pP
35e10 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  age->apOvfl[0]))
35e20 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
35e30 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
35e40 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
35e50 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
35e60 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75  ..    /* When mu
35e70 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
35e80 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72 65   occur, they are
35e90 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69   always sequenti
35ea0 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a  al and in.    **
35eb0 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20   sorted order.  
35ec0 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20  This invariants 
35ed0 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d 75  arise because mu
35ee0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
35ef0 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
35f00 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65   occur when inse
35f10 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63 65  rting divider ce
35f20 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
35f30 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a  ent page during.
35f40 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67      ** balancing
35f50 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  , and the divide
35f60 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20  rs are adjacent 
35f70 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20  and sorted..    
35f80 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  */.    assert( j
35f90 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69  ==0 || pPage->ai
35fa0 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69  Ovfl[j-1]<(u16)i
35fb0 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73   ); /* Overflows
35fc0 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
35fd0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35fe0 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65  j==0 || i==pPage
35ff0 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20  ->aiOvfl[j-1]+1 
36000 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  );   /* Overflow
36010 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c  s are sequential
36020 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
36030 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
36040 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
36050 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
36060 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36070 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
36080 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
36090 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
360a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
360b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
360c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
360d0 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
360e0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61  ge->aData;.    a
360f0 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50 61  ssert( &data[pPa
36100 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d  ge->cellOffset]=
36110 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  =pPage->aCellIdx
36120 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   );.    rc = all
36130 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
36140 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
36150 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
36160 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
36170 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
36180 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
36190 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
361a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70  e following prop
361b0 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
361c0 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
361d0 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20  essfully */.    
361e0 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30  assert( idx >= 0
361f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
36200 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65  idx >= pPage->ce
36210 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
36220 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52  ->nCell+2 || COR
36230 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61  RUPT_DB );.    a
36240 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
36250 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
36260 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
36270 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
36280 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
36290 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
362a0 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  ata[idx], pCell,
362b0 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43   sz);.    if( iC
362c0 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
362d0 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
362e0 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
362f0 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61  }.    pIns = pPa
36300 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69  ge->aCellIdx + i
36310 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  *2;.    memmove(
36320 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a  pIns+2, pIns, 2*
36330 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
36340 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  i));.    put2byt
36350 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20  e(pIns, idx);.  
36360 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
36370 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65  ;.    /* increme
36380 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  nt the cell coun
36390 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b  t */.    if( (++
363a0 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
363b0 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64  ffset+4])==0 ) d
363c0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
363d0 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61  fset+3]++;.    a
363e0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
363f0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
36400 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67  Offset+3])==pPag
36410 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e  e->nCell );.#ifn
36420 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36430 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
36440 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
36450 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
36460 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
36470 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
36480 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
36490 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
364a0 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
364b0 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
364c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
364d0 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
364e0 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
364f0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
36500 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
36510 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a  ll, pRC);.    }.
36520 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
36530 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20  .** A CellArray 
36540 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
36550 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74  a cache of point
36560 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f  ers and sizes fo
36570 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69  r a.** consecuti
36580 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ve sequence of c
36590 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20  ells that might 
365a0 62 65 20 68 65 6c 64 20 6d 75 6c 74 69 70 6c 65  be held multiple
365b0 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64   pages..*/.typed
365c0 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41 72  ef struct CellAr
365d0 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73  ray CellArray;.s
365e0 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
365f0 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  {.  int nCell;  
36600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
36610 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
36620 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
36630 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20 20  MemPage *pRef;  
36640 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
36650 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  ence page */.  u
36660 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
36670 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
36680 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
36690 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
366a0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
366b0 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
366c0 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
366d0 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  Cell[] */.};../*
366e0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
366f0 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74 20  e cell sizes at 
36700 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c  idx, idx+1, ...,
36710 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62 65   idx+N-1 have be
36720 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a  en.** computed..
36730 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
36740 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68 65  opulateCellCache
36750 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
36760 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a  nt idx, int N){.
36770 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
36780 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43   && idx+N<=p->nC
36790 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ell );.  while( 
367a0 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  N>0 ){.    asser
367b0 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  t( p->apCell[idx
367c0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
367d0 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d  p->szCell[idx]==
367e0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a  0 ){.      p->sz
367f0 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70  Cell[idx] = p->p
36800 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
36810 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
36820 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c  l[idx]);.    }el
36830 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
36840 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a  ( CORRUPT_DB ||.
36850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
36860 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d  >szCell[idx]==p-
36870 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
36880 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
36890 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20  ell[idx]) );.   
368a0 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20   }.    idx++;.  
368b0 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a    N--;.  }.}../*
368c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
368d0 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20 65  ize of the Nth e
368e0 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63 65  lement of the ce
368f0 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74  ll array.*/.stat
36900 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
36910 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43 65  NE u16 computeCe
36920 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79  llSize(CellArray
36930 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
36940 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e  ssert( N>=0 && N
36950 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  <p->nCell );.  a
36960 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c  ssert( p->szCell
36970 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  [N]==0 );.  p->s
36980 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52  zCell[N] = p->pR
36990 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d  ef->xCellSize(p-
369a0 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c  >pRef, p->apCell
369b0 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  [N]);.  return p
369c0 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73  ->szCell[N];.}.s
369d0 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65 64  tatic u16 cached
369e0 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72  CellSize(CellArr
369f0 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  ay *p, int N){. 
36a00 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26   assert( N>=0 &&
36a10 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20   N<p->nCell );. 
36a20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e   if( p->szCell[N
36a30 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a  ] ) return p->sz
36a40 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72  Cell[N];.  retur
36a50 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a  n computeCellSiz
36a60 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(p, N);.}../*.*
36a70 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
36a80 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
36a90 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72  rs to nCell b-tr
36aa0 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20 54  ee page cells. T
36ab0 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20  he .** szCell[] 
36ac0 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74  array contains t
36ad0 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
36ae0 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20 54   of each cell. T
36af0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
36b00 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75 72  replaces the cur
36b10 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
36b20 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20 74   page pPg with t
36b30 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
36b40 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79  he cell.** array
36b50 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20  ..**.** Some of 
36b60 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  the cells in apC
36b70 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e  ell[] may curren
36b80 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  tly be stored in
36b90 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75   pPg. This.** fu
36ba0 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f  nction works aro
36bb0 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75  und problems cau
36bc0 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20 6d  sed by this by m
36bd0 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20  aking a copy of 
36be0 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c  any .** such cel
36bf0 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  ls before overwr
36c00 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20 64  iting the page d
36c10 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d  ata..**.** The M
36c20 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69 65  emPage.nFree fie
36c30 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65  ld is invalidate
36c40 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
36c50 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  on. It is the .*
36c60 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
36c70 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
36c80 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63 74  o set it correct
36c90 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
36ca0 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20  t rebuildPage(. 
36cb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
36cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36cd0 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61   /* Edit this pa
36ce0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ge */.  int nCel
36cf0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
36d00 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
36d10 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
36d20 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   on page */.  u8
36d30 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
36d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36d50 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
36d60 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
36d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d80 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
36d90 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29   cell sizes */.)
36da0 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
36db0 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
36dc0 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
36dd0 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
36de0 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20   on pPg */.  u8 
36df0 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
36e00 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  pPg->aData;     
36e10 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
36e20 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67   to data for pPg
36e30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
36e40 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
36e50 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
36e60 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  e;.  u8 * const 
36e70 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73  pEnd = &aData[us
36e80 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74  ableSize];.  int
36e90 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   i;.  u8 *pCellp
36ea0 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
36eb0 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  dx;.  u8 *pTmp =
36ec0 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
36ed0 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d  pSpace(pPg->pBt-
36ee0 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a  >pPager);.  u8 *
36ef0 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65  pData;..  i = ge
36f00 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
36f10 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
36f20 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61  &pTmp[i], &aData
36f30 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  [i], usableSize 
36f40 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d  - i);..  pData =
36f50 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30   pEnd;.  for(i=0
36f60 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
36f70 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
36f80 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   apCell[i];.    
36f90 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
36fa0 4e 28 70 43 65 6c 6c 2c 61 44 61 74 61 2c 70 45  N(pCell,aData,pE
36fb0 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 70 43 65  nd) ){.      pCe
36fc0 6c 6c 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c  ll = &pTmp[pCell
36fd0 20 2d 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d   - aData];.    }
36fe0 0a 20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a  .    pData -= sz
36ff0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Cell[i];.    put
37000 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
37010 28 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 29  (pData - aData))
37020 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b  ;.    pCellptr +
37030 3d 20 32 3b 0a 20 20 20 20 69 66 28 20 70 44 61  = 2;.    if( pDa
37040 74 61 20 3c 20 70 43 65 6c 6c 70 74 72 20 29 20  ta < pCellptr ) 
37050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
37060 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
37070 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43  memcpy(pData, pC
37080 65 6c 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b  ell, szCell[i]);
37090 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 43  .    assert( szC
370a0 65 6c 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65  ell[i]==pPg->xCe
370b0 6c 6c 53 69 7a 65 28 70 50 67 2c 20 70 43 65 6c  llSize(pPg, pCel
370c0 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  l) || CORRUPT_DB
370d0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
370e0 28 20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67  ( szCell[i]!=pPg
370f0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c  ->xCellSize(pPg,
37100 70 43 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20  pCell) );.  }.. 
37110 20 2f 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72   /* The pPg->nFr
37120 65 65 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20  ee field is now 
37130 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  set incorrectly.
37140 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
37150 20 66 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50   fix it. */.  pP
37160 67 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c  g->nCell = nCell
37170 3b 0a 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c  ;.  pPg->nOverfl
37180 6f 77 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62  ow = 0;..  put2b
37190 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31  yte(&aData[hdr+1
371a0 5d 2c 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74  ], 0);.  put2byt
371b0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c  e(&aData[hdr+3],
371c0 20 70 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20   pPg->nCell);.  
371d0 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
371e0 68 64 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20  hdr+5], pData - 
371f0 61 44 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b  aData);.  aData[
37200 68 64 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20  hdr+7] = 0x00;. 
37210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37220 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61  K;.}../*.** Arra
37230 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61  y apCell[] conta
37240 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65  ins nCell pointe
37250 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c  rs to b-tree cel
37260 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c  ls. Array szCell
37270 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
37280 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
37290 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
372a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
372b0 61 74 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20  attempts to .** 
372c0 61 64 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74  add the cells st
372d0 6f 72 65 64 20 69 6e 20 74 68 65 20 61 72 72 61  ored in the arra
372e0 79 20 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49  y to page pPg. I
372f0 66 20 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63  f it cannot (bec
37300 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
37310 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65  e needs to be de
37320 66 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72  fragmented befor
37330 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c  e the cells will
37340 20 66 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a   fit), non-zero.
37350 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
37360 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
37370 65 20 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65  e cells are adde
37380 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
37390 7a 65 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72  zero is.** retur
373a0 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ned..**.** Argum
373b0 65 6e 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69  ent pCellptr poi
373c0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
373d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65   entry in the ce
373e0 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll-pointer array
373f0 0a 2a 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67  .** (part of pag
37400 65 20 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61  e pPg) to popula
37410 74 65 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61  te. After cell a
37420 70 43 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74  pCell[0] is writ
37430 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61  ten to the.** pa
37440 67 65 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69  ge body, a 16-bi
37450 74 20 6f 66 66 73 65 74 20 69 73 20 77 72 69 74  t offset is writ
37460 74 65 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e  ten to pCellptr.
37470 20 41 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20   And so on, for 
37480 65 61 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  each.** cell in 
37490 74 68 65 20 61 72 72 61 79 2e 20 49 74 20 69 73  the array. It is
374a0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
374b0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
374c0 72 20 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74  r to ensure.** t
374d0 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
374e0 6f 20 6f 76 65 72 77 72 69 74 65 20 74 68 69 73  o overwrite this
374f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c   part of the cel
37500 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e  l-pointer array.
37510 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
37520 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
37530 6c 65 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69  led, *ppData poi
37540 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
37550 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74   of the .** cont
37560 65 6e 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65  ent area on page
37570 20 70 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a   pPg. If the siz
37580 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
37590 20 61 72 65 61 20 69 73 20 65 78 74 65 6e 64 65   area is extende
375a0 64 2c 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73  d,.** *ppData is
375b0 20 75 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e   updated to poin
375c0 74 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61  t to the new sta
375d0 72 74 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  rt of the conten
375e0 74 20 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65  t area.** before
375f0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
37600 2a 20 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d  * Finally, argum
37610 65 6e 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74  ent pBegin point
37620 73 20 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d  s to the byte im
37630 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
37640 69 6e 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f  ing the.** end o
37650 66 20 74 68 65 20 73 70 61 63 65 20 72 65 71 75  f the space requ
37660 69 72 65 64 20 62 79 20 74 68 69 73 20 70 61 67  ired by this pag
37670 65 20 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70  e for the cell-p
37680 6f 69 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72  ointer area (for
37690 0a 2a 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20  .** all cells - 
376a0 6e 6f 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69  not just those i
376b0 6e 73 65 72 74 65 64 20 62 79 20 74 68 65 20 63  nserted by the c
376c0 75 72 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66  urrent call). If
376d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20   the content.** 
376e0 61 72 65 61 20 6d 75 73 74 20 62 65 20 65 78 74  area must be ext
376f0 65 6e 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20  ended to before 
37700 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72  this point in or
37710 64 65 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74  der to accomodat
37720 65 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69  e all.** cells i
37730 6e 20 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e  n apCell[], then
37740 20 74 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f   the cells do no
37750 74 20 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65  t fit and non-ze
37760 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
37770 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
37780 67 65 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20  geInsertArray(. 
37790 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
377a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377b0 20 2f 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20   /* Page to add 
377c0 63 65 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38  cells to */.  u8
377d0 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20   *pBegin,       
377e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
377f0 20 45 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69   End of cell-poi
37800 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
37810 75 38 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20  u8 **ppData,    
37820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37830 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20  /* IN/OUT: Page 
37840 63 6f 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f  content -area po
37850 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70  inter */.  u8 *p
37860 43 65 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20  Cellptr,        
37870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
37880 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f  inter to cell-po
37890 69 6e 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20  inter area */.  
378a0 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20  int iFirst,     
378b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378c0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
378d0 74 20 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f  t cell to add */
378e0 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
378f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37900 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
37910 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20  cells to add to 
37920 70 50 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72  pPg */.  CellArr
37930 61 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20  ay *pCArray     
37940 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
37950 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b  y of cells */.){
37960 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a  .  int i;.  u8 *
37970 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
37980 74 61 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20  ta;.  u8 *pData 
37990 3d 20 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e 74  = *ppData;.  int
379a0 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b   iEnd = iFirst +
379b0 20 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74   nCell;.  assert
379c0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
379d0 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  pPg->hdrOffset==
379e0 30 20 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72  0 );    /* Never
379f0 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20   called on page 
37a00 31 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69  1 */.  for(i=iFi
37a10 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b  rst; i<iEnd; i++
37a20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20 72  ){.    int sz, r
37a30 63 3b 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74  c;.    u8 *pSlot
37a40 3b 0a 20 20 20 20 73 7a 20 3d 20 63 61 63 68 65  ;.    sz = cache
37a50 64 43 65 6c 6c 53 69 7a 65 28 70 43 41 72 72 61  dCellSize(pCArra
37a60 79 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 28  y, i);.    if( (
37a70 61 44 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20 61  aData[1]==0 && a
37a80 44 61 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28  Data[2]==0) || (
37a90 70 53 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e 64  pSlot = pageFind
37aa0 53 6c 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63 29  Slot(pPg,sz,&rc)
37ab0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  )==0 ){.      pD
37ac0 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20  ata -= sz;.     
37ad0 20 69 66 28 20 70 44 61 74 61 3c 70 42 65 67 69   if( pData<pBegi
37ae0 6e 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  n ) return 1;.  
37af0 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74      pSlot = pDat
37b00 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  a;.    }.    /* 
37b10 70 53 6c 6f 74 20 61 6e 64 20 70 43 41 72 72 61  pSlot and pCArra
37b20 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 20 77 69 6c  y->apCell[i] wil
37b30 6c 20 6e 65 76 65 72 20 6f 76 65 72 6c 61 70 20  l never overlap 
37b40 6f 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  on a well-formed
37b50 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
37b60 2e 20 20 42 75 74 20 74 68 65 79 20 6d 69 67 68  .  But they migh
37b70 74 20 66 6f 72 20 61 20 63 6f 72 72 75 70 74 20  t for a corrupt 
37b80 64 61 74 61 62 61 73 65 2e 20 20 48 65 6e 63 65  database.  Hence
37b90 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 0a 20   use memmove(). 
37ba0 20 20 20 2a 2a 20 73 69 6e 63 65 20 6d 65 6d 63     ** since memc
37bb0 70 79 28 29 20 73 65 6e 64 73 20 53 49 47 41 42  py() sends SIGAB
37bc0 4f 52 54 20 77 69 74 68 20 6f 76 65 72 6c 61 70  ORT with overlap
37bd0 70 69 6e 67 20 62 75 66 66 65 72 73 20 6f 6e 20  ping buffers on 
37be0 4f 70 65 6e 42 53 44 20 2a 2f 0a 20 20 20 20 61  OpenBSD */.    a
37bf0 73 73 65 72 74 28 20 28 70 53 6c 6f 74 2b 73 7a  ssert( (pSlot+sz
37c00 29 3c 3d 70 43 41 72 72 61 79 2d 3e 61 70 43 65  )<=pCArray->apCe
37c10 6c 6c 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 7c  ll[i].         |
37c20 7c 20 70 53 6c 6f 74 3e 3d 28 70 43 41 72 72 61  | pSlot>=(pCArra
37c30 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29  y->apCell[i]+sz)
37c40 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  .         || COR
37c50 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 6d  RUPT_DB );.    m
37c60 65 6d 6d 6f 76 65 28 70 53 6c 6f 74 2c 20 70 43  emmove(pSlot, pC
37c70 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
37c80 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62  , sz);.    put2b
37c90 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
37ca0 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a  Slot - aData));.
37cb0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
37cc0 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61  2;.  }.  *ppData
37cd0 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75   = pData;.  retu
37ce0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
37cf0 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
37d00 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
37d10 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
37d20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
37d30 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ell .** contains
37d40 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
37d50 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
37d60 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
37d70 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20  ion adds the.** 
37d80 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64  space associated
37d90 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20   with each cell 
37da0 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61  in the array tha
37db0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  t is currently s
37dc0 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e  tored .** within
37dd0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67   the body of pPg
37de0 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65   to the pPg free
37df0 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d  -list. The cell-
37e00 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68  pointers and oth
37e10 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20  er.** fields of 
37e20 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74  the page are not
37e30 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
37e40 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
37e50 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
37e60 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
37e70 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
37e80 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e-list..*/.stati
37e90 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72  c int pageFreeAr
37ea0 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
37eb0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
37ec0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
37ed0 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20  o edit */.  int 
37ee0 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
37ef0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37f00 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c  irst cell to del
37f10 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ete */.  int nCe
37f20 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
37f30 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c           /* Cell
37f40 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
37f50 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72   CellArray *pCAr
37f60 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
37f70 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
37f80 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  ls */.){.  u8 * 
37f90 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
37fa0 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
37fb0 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
37fc0 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
37fd0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38  sableSize];.  u8
37fe0 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20   * const pStart 
37ff0 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64  = &aData[pPg->hd
38000 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50  rOffset + 8 + pP
38010 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  g->childPtrSize]
38020 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30  ;.  int nRet = 0
38030 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
38040 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b   iEnd = iFirst +
38050 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46   nCell;.  u8 *pF
38060 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ree = 0;.  int s
38070 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  zFree = 0;..  fo
38080 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45  r(i=iFirst; i<iE
38090 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  nd; i++){.    u8
380a0 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61   *pCell = pCArra
380b0 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20  y->apCell[i];.  
380c0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54    if( SQLITE_WIT
380d0 48 49 4e 28 70 43 65 6c 6c 2c 20 70 53 74 61 72  HIN(pCell, pStar
380e0 74 2c 20 70 45 6e 64 29 20 29 7b 0a 20 20 20 20  t, pEnd) ){.    
380f0 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20    int sz;.      
38100 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73  /* No need to us
38110 65 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  e cachedCellSize
38120 28 29 20 68 65 72 65 2e 20 20 54 68 65 20 73 69  () here.  The si
38130 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  zes of all cells
38140 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61   that.      ** a
38150 72 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  re to be freed h
38160 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
38170 20 63 6f 6d 70 75 74 69 6e 67 20 77 68 69 6c 65   computing while
38180 20 64 65 63 69 64 69 6e 67 20 77 68 69 63 68 0a   deciding which.
38190 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 6e        ** cells n
381a0 65 65 64 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20  eed freeing */. 
381b0 20 20 20 20 20 73 7a 20 3d 20 70 43 41 72 72 61       sz = pCArra
381c0 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61  y->szCell[i];  a
381d0 73 73 65 72 74 28 20 73 7a 3e 30 20 29 3b 0a 20  ssert( sz>0 );. 
381e0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 21 3d       if( pFree!=
381f0 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a  (pCell + sz) ){.
38200 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
38210 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
38220 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44 61  ssert( pFree>aDa
38230 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20 61  ta && (pFree - a
38240 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  Data)<65536 );. 
38250 20 20 20 20 20 20 20 20 20 66 72 65 65 53 70 61           freeSpa
38260 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46  ce(pPg, (u16)(pF
38270 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a  ree - aData), sz
38280 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Free);.        }
38290 0a 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d  .        pFree =
382a0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20   pCell;.        
382b0 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a 20 20 20  szFree = sz;.   
382c0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 2b 73       if( pFree+s
382d0 7a 3e 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20  z>pEnd ) return 
382e0 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
382f0 20 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20          pFree = 
38300 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73  pCell;.        s
38310 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20  zFree += sz;.   
38320 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 74 2b     }.      nRet+
38330 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
38340 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
38350 61 73 73 65 72 74 28 20 70 46 72 65 65 3e 61 44  assert( pFree>aD
38360 61 74 61 20 26 26 20 28 70 46 72 65 65 20 2d 20  ata && (pFree - 
38370 61 44 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a  aData)<65536 );.
38380 20 20 20 20 66 72 65 65 53 70 61 63 65 28 70 50      freeSpace(pP
38390 67 2c 20 28 75 31 36 29 28 70 46 72 65 65 20 2d  g, (u16)(pFree -
383a0 20 61 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29   aData), szFree)
383b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
383c0 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70  Ret;.}../*.** ap
383d0 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
383e0 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69  l[] contains poi
383f0 6e 74 65 72 73 20 74 6f 20 61 6e 64 20 73 69 7a  nters to and siz
38400 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  es of all cells 
38410 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 73 20  in the.** pages 
38420 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 20  being balanced. 
38430 20 54 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   The current pag
38440 65 2c 20 70 50 67 2c 20 68 61 73 20 70 50 67 2d  e, pPg, has pPg-
38450 3e 6e 43 65 6c 6c 20 63 65