/ Hex Artifact Content
Login

Artifact cd68bc5a0ce8e6e18f40131f2a5e0e8cf0e9090877c517c593c5d6ed78d0a3e1:


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 2f  , b) 0.#endif../
0f60: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
0f70: 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54  ion of the SQLIT
0f80: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 29  E_CORRUPT_PAGE()
0f90: 20 6d 61 63 72 6f 2e 20 54 61 6b 65 73 20 61 20   macro. Takes a 
0fa0: 73 69 6e 67 6c 65 0a 2a 2a 20 28 4d 65 6d 50 61  single.** (MemPa
0fb0: 67 65 2a 29 20 61 73 20 61 6e 20 61 72 67 75 6d  ge*) as an argum
0fc0: 65 6e 74 2e 20 54 68 65 20 28 4d 65 6d 50 61 67  ent. The (MemPag
0fd0: 65 2a 29 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  e*) must not be 
0fe0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  NULL..**.** If S
0ff0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 6e  QLITE_DEBUG is n
1000: 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  ot defined, then
1010: 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73 20 65   this macro is e
1020: 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a 2a 2a 20  quivalent to.** 
1030: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1040: 4b 50 54 2e 20 4f 72 2c 20 69 66 20 53 51 4c 49  KPT. Or, if SQLI
1050: 54 45 5f 44 45 42 55 47 20 69 73 20 73 65 74 2c  TE_DEBUG is set,
1060: 20 74 68 65 6e 20 74 68 65 20 6c 6f 67 20 6d 65   then the log me
1070: 73 73 61 67 65 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  ssage.** normall
1080: 79 20 70 72 6f 64 75 63 65 64 20 61 73 20 61 20  y produced as a 
1090: 73 69 64 65 2d 65 66 66 65 63 74 20 6f 66 20 53  side-effect of S
10a0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10b0: 50 54 20 69 73 20 61 75 67 6d 65 6e 74 65 64 0a  PT is augmented.
10c0: 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ** with the page
10d0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 66 69 6c 65   number and file
10e0: 6e 61 6d 65 20 61 73 73 6f 63 69 61 74 65 64 20  name associated 
10f0: 77 69 74 68 20 74 68 65 20 28 4d 65 6d 50 61 67  with the (MemPag
1100: 65 2a 29 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  e*)..*/.#ifdef S
1110: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
1120: 63 6f 72 72 75 70 74 50 61 67 65 45 72 72 6f 72  corruptPageError
1130: 28 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 4d 65 6d  (int lineno, Mem
1140: 50 61 67 65 20 2a 70 29 7b 0a 20 20 63 68 61 72  Page *p){.  char
1150: 20 2a 7a 4d 73 67 3b 0a 20 20 73 71 6c 69 74 65   *zMsg;.  sqlite
1160: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1170: 6f 63 28 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73  oc();.  zMsg = s
1180: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1190: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
11a0: 69 6f 6e 20 70 61 67 65 20 25 64 20 6f 66 20 25  ion page %d of %
11b0: 73 22 2c 0a 20 20 20 20 20 20 28 69 6e 74 29 70  s",.      (int)p
11c0: 2d 3e 70 67 6e 6f 2c 20 73 71 6c 69 74 65 33 50  ->pgno, sqlite3P
11d0: 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 2d 3e  agerFilename(p->
11e0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 0a  pBt->pPager, 0).
11f0: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e    );.  sqlite3En
1200: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
1210: 0a 20 20 69 66 28 20 7a 4d 73 67 20 29 7b 0a 20  .  if( zMsg ){. 
1220: 20 20 20 73 71 6c 69 74 65 33 52 65 70 6f 72 74     sqlite3Report
1230: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 4f 52  Error(SQLITE_COR
1240: 52 55 50 54 2c 20 6c 69 6e 65 6e 6f 2c 20 7a 4d  RUPT, lineno, zM
1250: 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  sg);.  }.  sqlit
1260: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20  e3_free(zMsg);. 
1270: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1280: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 23  ORRUPT_BKPT;.}.#
1290: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 43   define SQLITE_C
12a0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d 65 6d  ORRUPT_PAGE(pMem
12b0: 50 61 67 65 29 20 63 6f 72 72 75 70 74 50 61 67  Page) corruptPag
12c0: 65 45 72 72 6f 72 28 5f 5f 4c 49 4e 45 5f 5f 2c  eError(__LINE__,
12d0: 20 70 4d 65 6d 50 61 67 65 29 0a 23 65 6c 73 65   pMemPage).#else
12e0: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
12f0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 4d  _CORRUPT_PAGE(pM
1300: 65 6d 50 61 67 65 29 20 53 51 4c 49 54 45 5f 43  emPage) SQLITE_C
1310: 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 4d 65 6d  ORRUPT_PGNO(pMem
1320: 50 61 67 65 2d 3e 70 67 6e 6f 29 0a 23 65 6e 64  Page->pgno).#end
1330: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
1340: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1350: 41 43 48 45 0a 0a 23 69 66 64 65 66 20 53 51 4c  ACHE..#ifdef SQL
1360: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1370: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1380: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
1390: 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65 72  part of an asser
13a0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a  t() statement. *
13b0: 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  **.**.** Check t
13c0: 6f 20 73 65 65 20 69 66 20 70 42 74 72 65 65 20  o see if pBtree 
13d0: 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69 72  holds the requir
13e0: 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61 64  ed locks to read
13f0: 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
1400: 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69 74 68 20   .** table with 
1410: 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74 2e  root page iRoot.
1420: 20 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 69     Return 1 if i
1430: 74 20 64 6f 65 73 20 61 6e 64 20 30 20 69 66 20  t does and 0 if 
1440: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  not..**.** For e
1450: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 77 72 69  xample, when wri
1460: 74 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20  ting to a table 
1470: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
1480: 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20 42 74 72  Root via .** Btr
1490: 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42  ee connection pB
14a0: 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61  tree:.**.**    a
14b0: 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
14c0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
14d0: 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c  Btree, iRoot, 0,
14e0: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a   WRITE_LOCK) );.
14f0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72 69 74 69  **.** When writi
1500: 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 74  ng to an index t
1510: 68 61 74 20 72 65 73 69 64 65 73 20 69 6e 20 61  hat resides in a
1520: 20 73 68 61 72 61 62 6c 65 20 64 61 74 61 62 61   sharable databa
1530: 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  se, the .** call
1540: 65 72 20 73 68 6f 75 6c 64 20 68 61 76 65 20 66  er should have f
1550: 69 72 73 74 20 6f 62 74 61 69 6e 65 64 20 61 20  irst obtained a 
1560: 6c 6f 63 6b 20 73 70 65 63 69 66 79 69 6e 67 20  lock specifying 
1570: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1580: 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f  .** the correspo
1590: 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20 54 68 69  nding table. Thi
15a0: 73 20 6d 61 6b 65 73 20 74 68 69 6e 67 73 20 61  s makes things a
15b0: 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d 70 6c 69   bit more compli
15c0: 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20 74 68 69  cated,.** as thi
15d0: 73 20 6d 6f 64 75 6c 65 20 74 72 65 61 74 73 20  s module treats 
15e0: 65 61 63 68 20 74 61 62 6c 65 20 61 73 20 61 20  each table as a 
15f0: 73 65 70 61 72 61 74 65 20 73 74 72 75 63 74 75  separate structu
1600: 72 65 2e 20 54 6f 20 64 65 74 65 72 6d 69 6e 65  re. To determine
1610: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 63 6f  .** the table co
1620: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
1630: 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 77  he index being w
1640: 72 69 74 74 65 6e 2c 20 74 68 69 73 0a 2a 2a 20  ritten, this.** 
1650: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f 20  function has to 
1660: 73 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74  search through t
1670: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1680: 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61  ma..**.** Instea
1690: 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  d of a lock on t
16a0: 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 72  he table/index r
16b0: 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 69 52  ooted at page iR
16c0: 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  oot, the caller 
16d0: 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61 20 77 72  may.** hold a wr
16e0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
16f0: 73 63 68 65 6d 61 20 74 61 62 6c 65 20 28 72 6f  schema table (ro
1700: 6f 74 20 70 61 67 65 20 31 29 2e 20 54 68 69 73  ot page 1). This
1710: 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61 63 63 65   is also.** acce
1720: 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ptable..*/.stati
1730: 63 20 69 6e 74 20 68 61 73 53 68 61 72 65 64 43  c int hasSharedC
1740: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 0a 20  acheTableLock(. 
1750: 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
1760: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1770: 65 20 74 68 61 74 20 6d 75 73 74 20 68 6f 6c 64  e that must hold
1780: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20   lock */.  Pgno 
1790: 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20  iRoot,          
17a0: 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
17b0: 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e  f b-tree */.  in
17c0: 74 20 69 73 49 6e 64 65 78 2c 20 20 20 20 20 20  t isIndex,      
17d0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
17e0: 69 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f  iRoot is the roo
17f0: 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 62 2d  t of an index b-
1800: 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4c  tree */.  int eL
1810: 6f 63 6b 54 79 70 65 20 20 20 20 20 20 20 20 20  ockType         
1820: 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6c 6f 63   /* Required loc
1830: 6b 20 74 79 70 65 20 28 52 45 41 44 5f 4c 4f 43  k type (READ_LOC
1840: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
1850: 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65 6d 61 20   */.){.  Schema 
1860: 2a 70 53 63 68 65 6d 61 20 3d 20 28 53 63 68 65  *pSchema = (Sche
1870: 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e 70 42 74  ma *)pBtree->pBt
1880: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 50 67 6e  ->pSchema;.  Pgn
1890: 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20 20 42 74  o iTab = 0;.  Bt
18a0: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20 20  Lock *pLock;..  
18b0: 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62  /* If this datab
18c0: 61 73 65 20 69 73 20 6e 6f 74 20 73 68 61 72 65  ase is not share
18d0: 61 62 6c 65 2c 20 6f 72 20 69 66 20 74 68 65 20  able, or if the 
18e0: 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e  client is readin
18f0: 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61 73 20 74  g.  ** and has t
1900: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
1910: 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68  ted flag set, th
1920: 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73 20 72 65  en no lock is re
1930: 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a 20 52 65  quired. .  ** Re
1940: 74 75 72 6e 20 74 72 75 65 20 69 6d 6d 65 64 69  turn true immedi
1950: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
1960: 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61  ( (pBtree->shara
1970: 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65  ble==0).   || (e
1980: 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c  LockType==READ_L
1990: 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e  OCK && (pBtree->
19a0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
19b0: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 29  TE_ReadUncommit)
19c0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
19d0: 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 1;.  }..  /* I
19e0: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
19f0: 72 65 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74  reading  or writ
1a00: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64  ing an index and
1a10: 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20   the schema is. 
1a20: 20 2a 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20   ** not loaded, 
1a30: 74 68 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64  then it is too d
1a40: 69 66 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75  ifficult to actu
1a50: 61 6c 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65  ally check to se
1a60: 65 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e if.  ** the co
1a70: 72 72 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20  rrect locks are 
1a80: 68 65 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  held.  So do not
1a90: 20 62 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72   bother - just r
1aa0: 65 74 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a  eturn true..  **
1ab0: 20 54 68 69 73 20 63 61 73 65 20 64 6f 65 73 20   This case does 
1ac0: 6e 6f 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79  not come up very
1ad0: 20 6f 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20   often anyhow.. 
1ae0: 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65   */.  if( isInde
1af0: 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c  x && (!pSchema |
1b00: 7c 20 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  | (pSchema->sche
1b10: 6d 61 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d  maFlags&DB_Schem
1b20: 61 4c 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a  aLoaded)==0) ){.
1b30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1b40: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
1b50: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
1b60: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
1b70: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
1b80: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
1b90: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
1ba0: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1bb0: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1bc0: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1bd0: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1be0: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1bf0: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1c00: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1c10: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
1c20: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
1c30: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
1c40: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
1c50: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
1c60: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
1c70: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
1c80: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
1c90: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1ca0: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1cb0: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1cc0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1cd0: 3e 74 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f  >tnum==(int)iRoo
1ce0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
1cf0: 20 69 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20   iTab ){.       
1d00: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
1d10: 65 20 69 6e 64 65 78 65 73 20 73 68 61 72 65 20  e indexes share 
1d20: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1d30: 67 65 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a  ge.  There must.
1d40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
1d50: 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e  imposter tables.
1d60: 20 20 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e    So just return
1d70: 20 74 72 75 65 2e 20 20 54 68 65 20 61 73 73 65   true.  The asse
1d80: 72 74 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  rt is not.      
1d90: 20 20 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e      ** useful in
1da0: 20 74 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20   that case. */. 
1db0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1dc0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
1dd0: 20 20 20 20 20 69 54 61 62 20 3d 20 70 49 64 78       iTab = pIdx
1de0: 2d 3e 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a  ->pTable->tnum;.
1df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20  }else{.    iTab 
1e10: 3d 20 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20  = iRoot;.  }..  
1e20: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
1e30: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e  e required lock.
1e40: 20 45 69 74 68 65 72 20 61 20 77 72 69 74 65 2d   Either a write-
1e50: 6c 6f 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67  lock on root-pag
1e60: 65 20 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20  e iTab, a .  ** 
1e70: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
1e80: 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20  e schema table, 
1e90: 6f 72 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e  or (if the clien
1ea0: 74 20 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a  t is reading) a.
1eb0: 20 20 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f    ** read-lock o
1ec0: 6e 20 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66  n iTab will suff
1ed0: 69 63 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66  ice. Return 1 if
1ee0: 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72   any of these ar
1ef0: 65 20 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66  e found.  */.  f
1f00: 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d  or(pLock=pBtree-
1f10: 3e 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f  >pBt->pLock; pLo
1f20: 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d  ck; pLock=pLock-
1f30: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
1f40: 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d   pLock->pBtree==
1f50: 70 42 74 72 65 65 20 0a 20 20 20 20 20 26 26 20  pBtree .     && 
1f60: 28 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d  (pLock->iTable==
1f70: 69 54 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e  iTab || (pLock->
1f80: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1f90: 4b 20 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  K && pLock->iTab
1fa0: 6c 65 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20  le==1)).     && 
1fb0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c  pLock->eLock>=eL
1fc0: 6f 63 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a  ockType .    ){.
1fd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1fe0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ff0: 46 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74  Failed to find t
2000: 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
2010: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  . */.  return 0;
2020: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2030: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
2040: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2050: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
2060: 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75  unction may be u
2070: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
2080: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
2090: 74 73 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a  ts only. ****.**
20a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
20b0: 69 66 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69  if it would be i
20c0: 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65  llegal for pBtre
20d0: 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
20e0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20  the.** table or 
20f0: 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20  index rooted at 
2100: 69 52 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74  iRoot because ot
2110: 68 65 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65  her shared conne
2120: 63 74 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69  ctions are.** si
2130: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61  multaneously rea
2140: 64 69 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74  ding that same t
2150: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a  able or index..*
2160: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67  *.** It is illeg
2170: 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f  al for pBtree to
2180: 20 77 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f   write if some o
2190: 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63  ther Btree objec
21a0: 74 20 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73  t that.** shares
21b0: 20 74 68 65 20 73 61 6d 65 20 42 74 53 68 61 72   the same BtShar
21c0: 65 64 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72  ed object is cur
21d0: 72 65 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f  rently reading o
21e0: 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  r writing.** the
21f0: 20 69 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45   iRoot table.  E
2200: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74  xcept, if the ot
2210: 68 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74  her Btree object
2220: 20 68 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64   has the.** read
2230: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
2240: 67 20 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69  g set, then it i
2250: 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68  s OK for the oth
2260: 65 72 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20  er object to.** 
2270: 68 61 76 65 20 61 20 72 65 61 64 20 63 75 72 73  have a read curs
2280: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  or..**.** For ex
2290: 61 6d 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72  ample, before wr
22a0: 69 74 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72  iting to any par
22b0: 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  t of the table o
22c0: 72 20 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65  r index.** roote
22d0: 64 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c  d at page iRoot,
22e0: 20 6f 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c   one should call
22f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72  :.**.**    asser
2300: 74 28 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  t( !hasReadConfl
2310: 69 63 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f  icts(pBtree, iRo
2320: 6f 74 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63  ot) );.*/.static
2330: 20 69 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66   int hasReadConf
2340: 6c 69 63 74 73 28 42 74 72 65 65 20 2a 70 42 74  licts(Btree *pBt
2350: 72 65 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29  ree, Pgno iRoot)
2360: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
2370: 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d  .  for(p=pBtree-
2380: 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
2390: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
23a0: 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
23b0: 6f 74 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20  ot==iRoot .     
23c0: 26 26 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42  && p->pBtree!=pB
23d0: 74 72 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d  tree.     && 0==
23e0: 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  (p->pBtree->db->
23f0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52  flags & SQLITE_R
2400: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 0a 20 20 20  eadUncommit).   
2410: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2420: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2430: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
2440: 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20  if    /* #ifdef 
2450: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a  SQLITE_DEBUG */.
2460: 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20  ./*.** Query to 
2470: 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61 6e  see if Btree han
2480: 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e  dle p may obtain
2490: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20   a lock of type 
24a0: 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f  eLock .** (READ_
24b0: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
24c0: 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  CK) on the table
24d0: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
24e0: 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  iTab. Return.** 
24f0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65  SQLITE_OK if the
2500: 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74   lock may be obt
2510: 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e  ained (by callin
2520: 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61  g.** setSharedCa
2530: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c  cheTableLock()),
2540: 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   or SQLITE_LOCKE
2550: 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  D if not..*/.sta
2560: 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68 61  tic int querySha
2570: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2580: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2590: 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29   iTab, u8 eLock)
25a0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
25b0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
25c0: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20  Lock *pIter;..  
25d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
25e0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
25f0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2600: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20  Lock==READ_LOCK 
2610: 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  || eLock==WRITE_
2620: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
2630: 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  ( p->db!=0 );.  
2640: 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62 2d  assert( !(p->db-
2650: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2660: 61 64 55 6e 63 6f 6d 6d 69 74 29 7c 7c 65 4c 6f  adUncommit)||eLo
2670: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c  ck==WRITE_LOCK||
2680: 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  iTab==1 );.  .  
2690: 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67  /* If requesting
26a0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74   a write-lock, t
26b0: 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75  hen the Btree mu
26c0: 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  st have an open 
26d0: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
26e0: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66  action on this f
26f0: 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75  ile. And, obviou
2700: 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f  sly, for this to
2710: 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20   be so there .  
2720: 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  ** must be an op
2730: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
2740: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65  tion on the file
2750: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
2760: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2770: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d  EAD_LOCK || (p==
2780: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20  pBt->pWriter && 
2790: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
27a0: 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73  S_WRITE) );.  as
27b0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
27c0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69  D_LOCK || pBt->i
27d0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
27e0: 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a  ANS_WRITE );.  .
27f0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
2800: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  e is a no-op if 
2810: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
2820: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
2830: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
2840: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
2850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2860: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65   }..  /* If some
2870: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2880: 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20  n is holding an 
2890: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
28a0: 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65 73 74  the.  ** request
28b0: 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f 74 20  ed lock may not 
28c0: 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20 20 2a  be obtained..  *
28d0: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72  /.  if( pBt->pWr
28e0: 69 74 65 72 21 3d 70 20 26 26 20 28 70 42 74 2d  iter!=p && (pBt-
28f0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
2900: 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 7b  EXCLUSIVE)!=0 ){
2910: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
2920: 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
2930: 3e 64 62 2c 20 70 42 74 2d 3e 70 57 72 69 74 65  >db, pBt->pWrite
2940: 72 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75  r->db);.    retu
2950: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2960: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2970: 7d 0a 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  }..  for(pIter=p
2980: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
2990: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
29a0: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Next){.    /* Th
29b0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28 70 49 74  e condition (pIt
29c0: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
29d0: 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ) in the followi
29e0: 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20 20 20 20  ng if(...) .    
29f0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  ** statement is 
2a00: 61 20 73 69 6d 70 6c 69 66 69 63 61 74 69 6f 6e  a simplification
2a10: 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
2a20: 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d 3d 57 52 49  **   (eLock==WRI
2a30: 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72  TE_LOCK || pIter
2a40: 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ->eLock==WRITE_L
2a50: 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  OCK).    **.    
2a60: 2a 2a 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77  ** since we know
2a70: 20 74 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d   that if eLock==
2a80: 57 52 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e  WRITE_LOCK, then
2a90: 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
2aa0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6d 61 79 20  tion.    ** may 
2ab0: 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43  hold a WRITE_LOC
2ac0: 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69  K on any table i
2ad0: 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e  n this file (sin
2ae0: 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20  ce there can.   
2af0: 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73 69   ** only be a si
2b00: 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0a 20 20  ngle writer)..  
2b10: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2b20: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52   pIter->eLock==R
2b30: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
2b40: 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f  r->eLock==WRITE_
2b50: 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
2b60: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
2b70: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 70  LOCK || pIter->p
2b80: 42 74 72 65 65 3d 3d 70 20 7c 7c 20 70 49 74 65  Btree==p || pIte
2b90: 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  r->eLock==READ_L
2ba0: 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 70 49  OCK);.    if( pI
2bb0: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
2bc0: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
2bd0: 3d 69 54 61 62 20 26 26 20 70 49 74 65 72 2d 3e  =iTab && pIter->
2be0: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a  eLock!=eLock ){.
2bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
2c00: 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70  nectionBlocked(p
2c10: 2d 3e 64 62 2c 20 70 49 74 65 72 2d 3e 70 42 74  ->db, pIter->pBt
2c20: 72 65 65 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20  ree->db);.      
2c30: 69 66 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45  if( eLock==WRITE
2c40: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
2c50: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d   assert( p==pBt-
2c60: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
2c70: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
2c80: 73 20 7c 3d 20 42 54 53 5f 50 45 4e 44 49 4e 47  s |= BTS_PENDING
2c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2cb0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
2cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2ce0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2cf0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
2d00: 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65  CACHE */..#ifnde
2d10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
2d20: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
2d30: 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   Add a lock on t
2d40: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2d50: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 74  ot-page iTable t
2d60: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
2d70: 65 65 20 75 73 65 64 0a 2a 2a 20 62 79 20 42 74  ee used.** by Bt
2d80: 72 65 65 20 68 61 6e 64 6c 65 20 70 2e 20 50 61  ree handle p. Pa
2d90: 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75  rameter eLock mu
2da0: 73 74 20 62 65 20 65 69 74 68 65 72 20 52 45 41  st be either REA
2db0: 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52  D_LOCK or .** WR
2dc0: 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ITE_LOCK..**.** 
2dd0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
2de0: 73 75 6d 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77  sumes the follow
2df0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29  ing:.**.**   (a)
2e00: 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20 42   The specified B
2e10: 74 72 65 65 20 6f 62 6a 65 63 74 20 70 20 69 73  tree object p is
2e20: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
2e30: 73 68 61 72 61 62 6c 65 0a 2a 2a 20 20 20 20 20  sharable.**     
2e40: 20 20 64 61 74 61 62 61 73 65 20 28 6f 6e 65 20    database (one 
2e50: 77 69 74 68 20 74 68 65 20 42 74 53 68 61 72 65  with the BtShare
2e60: 64 2e 73 68 61 72 61 62 6c 65 20 66 6c 61 67 20  d.sharable flag 
2e70: 73 65 74 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20  set), and.**.** 
2e80: 20 20 28 62 29 20 4e 6f 20 6f 74 68 65 72 20 42    (b) No other B
2e90: 74 72 65 65 20 6f 62 6a 65 63 74 73 20 68 6f 6c  tree objects hol
2ea0: 64 20 61 20 6c 6f 63 6b 20 74 68 61 74 20 63 6f  d a lock that co
2eb0: 6e 66 6c 69 63 74 73 0a 2a 2a 20 20 20 20 20 20  nflicts.**      
2ec0: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 65 73   with the reques
2ed0: 74 65 64 20 6c 6f 63 6b 20 28 69 2e 65 2e 20 71  ted lock (i.e. q
2ee0: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2ef0: 61 62 6c 65 4c 6f 63 6b 28 29 20 68 61 73 0a 2a  ableLock() has.*
2f00: 2a 20 20 20 20 20 20 20 61 6c 72 65 61 64 79 20  *       already 
2f10: 62 65 65 6e 20 63 61 6c 6c 65 64 20 61 6e 64 20  been called and 
2f20: 72 65 74 75 72 6e 65 64 20 53 51 4c 49 54 45 5f  returned SQLITE_
2f30: 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  OK)..**.** SQLIT
2f40: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2f50: 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   if the lock is 
2f60: 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75 6c  added successful
2f70: 6c 79 2e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ly. SQLITE_NOMEM
2f80: 20 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64   .** is returned
2f90: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 61 74 74   if a malloc att
2fa0: 65 6d 70 74 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73  empt fails..*/.s
2fb0: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
2fc0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2fd0: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
2fe0: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
2ff0: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
3000: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
3010: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
3020: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
3030: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
3040: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3050: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
3060: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
3070: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
3080: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
3090: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
30a0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e  0 );..  /* A con
30b0: 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  nection with the
30c0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
30d0: 64 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20  d flag set will 
30e0: 6e 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a  never try to.  *
30f0: 2a 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d  * obtain a read-
3100: 6c 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20  lock using this 
3110: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e  function. The on
3120: 6c 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74  ly read-lock obt
3130: 61 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20  ained.  ** by a 
3140: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65  connection in re
3150: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d  ad-uncommitted m
3160: 6f 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71  ode is on the sq
3170: 6c 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a  lite_master .  *
3180: 2a 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61  * table, and tha
3190: 74 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  t lock is obtain
31a0: 65 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e  ed in BtreeBegin
31b0: 54 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61  Trans().  */.  a
31c0: 73 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62  ssert( 0==(p->db
31d0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
31e0: 65 61 64 55 6e 63 6f 6d 6d 69 74 29 20 7c 7c 20  eadUncommit) || 
31f0: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
3200: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  K );..  /* This 
3210: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
3220: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f  only be called o
3230: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74  n a sharable b-t
3240: 72 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20  ree after it .  
3250: 2a 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65  ** has been dete
3260: 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f  rmined that no o
3270: 74 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64  ther b-tree hold
3280: 73 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20  s a conflicting 
3290: 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65  lock.  */.  asse
32a0: 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  rt( p->sharable 
32b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
32c0: 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61  ITE_OK==querySha
32d0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
32e0: 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f  k(p, iTable, eLo
32f0: 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72  ck) );..  /* Fir
3300: 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69  st search the li
3310: 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  st for an existi
3320: 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20  ng lock on this 
3330: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
3340: 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
3350: 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
3360: 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
3370: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61    if( pIter->iTa
3380: 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70  ble==iTable && p
3390: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
33a0: 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d  ){.      pLock =
33b0: 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72   pIter;.      br
33c0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
33d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76    /* If the abov
33e0: 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74  e search did not
33f0: 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73   find a BtLock s
3400: 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e  truct associatin
3410: 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77  g Btree p.  ** w
3420: 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65  ith table iTable
3430: 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61  , allocate one a
3440: 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20  nd link it into 
3450: 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  the list..  */. 
3460: 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20   if( !pLock ){. 
3470: 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f     pLock = (BtLo
3480: 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  ck *)sqlite3Mall
3490: 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74  ocZero(sizeof(Bt
34a0: 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20  Lock));.    if( 
34b0: 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  !pLock ){.      
34c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
34d0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
34e0: 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c      pLock->iTabl
34f0: 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20  e = iTable;.    
3500: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20  pLock->pBtree = 
3510: 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e  p;.    pLock->pN
3520: 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b  ext = pBt->pLock
3530: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b  ;.    pBt->pLock
3540: 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20   = pLock;.  }.. 
3550: 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f   /* Set the BtLo
3560: 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c  ck.eLock variabl
3570: 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d  e to the maximum
3580: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
3590: 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68  lock.  ** and th
35a0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
35b0: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20  . This means if 
35c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73  a write-lock was
35d0: 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20   already held.  
35e0: 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f  ** and a read-lo
35f0: 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65  ck requested, we
3600: 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74   don't incorrect
3610: 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65  ly downgrade the
3620: 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73   lock..  */.  as
3630: 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b  sert( WRITE_LOCK
3640: 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  >READ_LOCK );.  
3650: 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d  if( eLock>pLock-
3660: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c  >eLock ){.    pL
3670: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f  ock->eLock = eLo
3680: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ck;.  }..  retur
3690: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
36a0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
36b0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
36c0: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
36d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
36e0: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65  D_CACHE./*.** Re
36f0: 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61  lease all the ta
3700: 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73  ble locks (locks
3710: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61   obtained via ca
3720: 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65  lls to.** the se
3730: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
3740: 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72  eLock() procedur
3750: 65 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65  e) held by Btree
3760: 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a   object p..**.**
3770: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
3780: 73 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65  ssumes that Btre
3790: 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  e p has an open 
37a0: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a  read or write .*
37b0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49  * transaction. I
37c0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74  f it does not, t
37d0: 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44  hen the BTS_PEND
37e0: 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20  ING flag.** may 
37f0: 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63  be incorrectly c
3800: 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
3810: 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53  c void clearAllS
3820: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
3830: 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  ocks(Btree *p){.
3840: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
3850: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
3860: 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70  ck **ppIter = &p
3870: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73  Bt->pLock;..  as
3880: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
3890: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
38a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
38b0: 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a  sharable || 0==*
38c0: 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65  ppIter );.  asse
38d0: 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30  rt( p->inTrans>0
38e0: 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70   );..  while( *p
38f0: 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c  pIter ){.    BtL
3900: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70  ock *pLock = *pp
3910: 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Iter;.    assert
3920: 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
3930: 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45   & BTS_EXCLUSIVE
3940: 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72  )==0 || pBt->pWr
3950: 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74  iter==pLock->pBt
3960: 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ree );.    asser
3970: 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  t( pLock->pBtree
3980: 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b  ->inTrans>=pLock
3990: 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69  ->eLock );.    i
39a0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
39b0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
39c0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
39d0: 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ext;.      asser
39e0: 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  t( pLock->iTable
39f0: 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70  !=1 || pLock==&p
3a00: 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20  ->lock );.      
3a10: 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c  if( pLock->iTabl
3a20: 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=1 ){.        
3a30: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f  sqlite3_free(pLo
3a40: 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ck);.      }.   
3a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
3a60: 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70  Iter = &pLock->p
3a70: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
3a80: 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d  .  assert( (pBt-
3a90: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
3aa0: 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70  PENDING)==0 || p
3ab0: 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
3ac0: 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65   if( pBt->pWrite
3ad0: 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d  r==p ){.    pBt-
3ae0: 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20  >pWriter = 0;.  
3af0: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3b00: 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49  &= ~(BTS_EXCLUSI
3b10: 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b  VE|BTS_PENDING);
3b20: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74  .  }else if( pBt
3b30: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  ->nTransaction==
3b40: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  2 ){.    /* This
3b50: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
3b60: 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70  led when Btree p
3b70: 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69   is concluding i
3b80: 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ts .    ** trans
3b90: 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65  action. If there
3ba0: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
3bb0: 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20  s a writer, and 
3bc0: 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  p is not.    ** 
3bd0: 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65  that writer, the
3be0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3bf0: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
3c00: 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a  nnections other.
3c10: 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20      ** than the 
3c20: 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61  writer must be a
3c30: 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20  bout to drop to 
3c40: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
3c50: 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  se.    ** set th
3c60: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3c70: 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a  ag to 0..    **.
3c80: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20      ** If there 
3c90: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
3ca0: 20 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20   a writer, then 
3cb0: 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74  BTS_PENDING must
3cc0: 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20  .    ** be zero 
3cd0: 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73  already. So this
3ce0: 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61   next line is ha
3cf0: 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63  rmless in that c
3d00: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
3d10: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
3d20: 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20   ~BTS_PENDING;. 
3d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
3d40: 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65   function change
3d50: 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b  s all write-lock
3d60: 73 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  s held by Btree 
3d70: 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b  p into read-lock
3d80: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
3d90: 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  d downgradeAllSh
3da0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3db0: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
3dc0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
3dd0: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70   p->pBt;.  if( p
3de0: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3df0: 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  {.    BtLock *pL
3e00: 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57  ock;.    pBt->pW
3e10: 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70  riter = 0;.    p
3e20: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3e30: 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c  ~(BTS_EXCLUSIVE|
3e40: 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20  BTS_PENDING);.  
3e50: 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d    for(pLock=pBt-
3e60: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
3e70: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
3e80: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
3e90: 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d  ( pLock->eLock==
3ea0: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f  READ_LOCK || pLo
3eb0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b  ck->pBtree==p );
3ec0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c  .      pLock->eL
3ed0: 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
3ee0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65  .    }.  }.}..#e
3ef0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
3f00: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
3f10: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
3f20: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
3f30: 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 20  Page *pPage);   
3f40: 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72 64        /* Forward
3f50: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
3f60: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
3f70: 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
3f80: 20 2a 70 50 61 67 65 29 3b 20 20 20 20 20 20 2f   *pPage);      /
3f90: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
3fa0: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nce */.static vo
3fb0: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
3fc0: 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
3fd0: 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61  Page);  /* Forwa
3fe0: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
3ff0: 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20 72  ./*.***** This r
4000: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 69  outine is used i
4010: 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74 28  nside of assert(
4020: 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a 2a  ) only ****.**.*
4030: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
4040: 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 74  e cursor holds t
4050: 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73 20  he mutex on its 
4060: 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66 64  BtShared.*/.#ifd
4070: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4080: 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f  static int curso
4090: 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75  rHoldsMutex(BtCu
40a0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75  rsor *p){.  retu
40b0: 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
40c0: 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75  _held(p->pBt->mu
40d0: 74 65 78 29 3b 0a 7d 0a 0a 2f 2a 20 56 65 72 69  tex);.}../* Veri
40e0: 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73  fy that the curs
40f0: 6f 72 20 61 6e 64 20 74 68 65 20 42 74 53 68 61  or and the BtSha
4100: 72 65 64 20 61 67 72 65 65 20 61 62 6f 75 74 20  red agree about 
4110: 77 68 61 74 20 69 73 20 74 68 65 20 63 75 72 72  what is the curr
4120: 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
4130: 63 6f 6e 6e 65 74 69 6f 6e 2e 20 54 68 69 73 20  connetion. This 
4140: 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20  is important in 
4150: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
4160: 65 2e 20 49 66 20 74 68 65 20 64 61 74 61 62 61  e. If the databa
4170: 73 65 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  se .** connectio
4180: 6e 20 70 6f 69 6e 74 65 72 73 20 67 65 74 20 6f  n pointers get o
4190: 75 74 2d 6f 66 2d 73 79 6e 63 2c 20 69 74 20 69  ut-of-sync, it i
41a0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72  s possible for r
41b0: 6f 75 74 69 6e 65 73 20 6c 69 6b 65 0a 2a 2a 20  outines like.** 
41c0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
41d0: 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 20  to reference an 
41e0: 73 74 61 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  stale connection
41f0: 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 72 65   pointer that re
4200: 66 65 72 65 6e 63 65 73 20 61 0a 2a 2a 20 61 20  ferences a.** a 
4210: 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
4220: 68 61 73 20 61 6c 72 65 61 64 79 20 63 6c 6f 73  has already clos
4230: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
4240: 65 20 69 73 20 75 73 65 64 20 69 6e 73 69 64 65  e is used inside
4250: 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61   assert().** sta
4260: 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 20 61 6e 64  tements only and
4270: 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   for the purpose
4280: 20 6f 66 20 64 6f 75 62 6c 65 2d 63 68 65 63 6b   of double-check
4290: 69 6e 67 20 74 68 61 74 20 74 68 65 20 62 74 72  ing that the btr
42a0: 65 65 20 63 6f 64 65 0a 2a 2a 20 64 6f 65 73 20  ee code.** does 
42b0: 6b 65 65 70 20 74 68 65 20 64 61 74 61 62 61 73  keep the databas
42c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69  e connection poi
42d0: 6e 74 65 72 73 20 75 70 2d 74 6f 2d 64 61 74 65  nters up-to-date
42e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
42f0: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
4300: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ed(BtCursor *p){
4310: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
4320: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  rHoldsMutex(p) )
4330: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  ;.  return (p->p
4340: 42 74 72 65 65 2d 3e 64 62 3d 3d 70 2d 3e 70 42  Btree->db==p->pB
4350: 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65 6e 64 69 66  t->db);.}.#endif
4360: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
4370: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
4380: 63 61 63 68 65 20 6f 66 20 74 68 65 20 63 75 72  cache of the cur
4390: 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  sor passed as th
43a0: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
43b0: 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  ..** on the shar
43c0: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
43d0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 23 64 65 66 69  re pBt..*/.#defi
43e0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  ne invalidateOve
43f0: 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29  rflowCache(pCur)
4400: 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
4410: 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64 4f   &= ~BTCF_ValidO
4420: 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  vfl)../*.** Inva
4430: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
4440: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
4450: 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73  che for all curs
4460: 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e  ors opened.** on
4470: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
4480: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
4490: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
44a0: 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
44b0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61  rflowCache(BtSha
44c0: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
44d0: 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65  ursor *p;.  asse
44e0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
44f0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
4500: 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  x) );.  for(p=pB
4510: 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
4520: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
4530: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
4540: 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a  owCache(p);.  }.
4550: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4560: 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
4570: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4580: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 65  ion is called be
4590: 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
45a0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
45b0: 20 74 61 62 6c 65 0a 2a 2a 20 74 6f 20 69 6e 76   table.** to inv
45c0: 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72  alidate any incr
45d0: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61  blob cursors tha
45e0: 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  t are open on th
45f0: 65 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20  e.** row or one 
4600: 6f 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e  of the rows bein
4610: 67 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  g modified..**.*
4620: 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69 73  * If argument is
4630: 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74 72  ClearTable is tr
4640: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e 74  ue, then the ent
4650: 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ire contents of 
4660: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73 20  the.** table is 
4670: 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c 65  about to be dele
4680: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
4690: 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  e invalidate all
46a0: 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75 72   incrblob.** cur
46b0: 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 79  sors open on any
46c0: 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65 20   row within the 
46d0: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
46e0: 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  page pgnoRoot..*
46f0: 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
4700: 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c  if argument isCl
4710: 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c 73  earTable is fals
4720: 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77 20  e, then the row 
4730: 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69 52  with.** rowid iR
4740: 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70 6c  ow is being repl
4750: 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64 2e  aced or deleted.
4760: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
4770: 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79  validate.** only
4780: 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62 20   those incrblob 
4790: 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
47a0: 74 68 61 74 20 73 70 65 63 69 66 69 63 20 72 6f  that specific ro
47b0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
47c0: 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  d invalidateIncr
47d0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20 42  blobCursors(.  B
47e0: 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20  tree *pBtree,   
47f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
4800: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63  tabase file to c
4810: 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  heck */.  Pgno p
4820: 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20  gnoRoot,        
4830: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
4840: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
4850: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 69  nging */.  i64 i
4860: 52 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  Row,            
4870: 20 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20     /* The rowid 
4880: 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68  that might be ch
4890: 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  anging */.  int 
48a0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20  isClearTable    
48b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
48c0: 6c 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e  ll rows are bein
48d0: 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a  g deleted */.){.
48e0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
48f0: 20 69 66 28 20 70 42 74 72 65 65 2d 3e 68 61 73   if( pBtree->has
4900: 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d 30 20 29  IncrblobCur==0 )
4910: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4920: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
4930: 6f 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65  oldsMutex(pBtree
4940: 29 20 29 3b 0a 20 20 70 42 74 72 65 65 2d 3e 68  ) );.  pBtree->h
4950: 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20  asIncrblobCur = 
4960: 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  0;.  for(p=pBtre
4970: 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
4980: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
4990: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 63 75 72  .    if( (p->cur
49a0: 46 6c 61 67 73 20 26 20 42 54 43 46 5f 49 6e 63  Flags & BTCF_Inc
49b0: 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a 20 20 20  rblob)!=0 ){.   
49c0: 20 20 20 70 42 74 72 65 65 2d 3e 68 61 73 49 6e     pBtree->hasIn
49d0: 63 72 62 6c 6f 62 43 75 72 20 3d 20 31 3b 0a 20  crblobCur = 1;. 
49e0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f       if( p->pgno
49f0: 52 6f 6f 74 3d 3d 70 67 6e 6f 52 6f 6f 74 20 26  Root==pgnoRoot &
4a00: 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65 20  & (isClearTable 
4a10: 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d  || p->info.nKey=
4a20: 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20 20  =iRow) ){.      
4a30: 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55    p->eState = CU
4a40: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
4a50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4a60: 7d 0a 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74  }..#else.  /* St
4a70: 75 62 20 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e  ub function when
4a80: 20 49 4e 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69   INCRBLOB is omi
4a90: 74 74 65 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e  tted */.  #defin
4aa0: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
4ab0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c  blobCursors(w,x,
4ac0: 79 2c 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  y,z).#endif /* S
4ad0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
4ae0: 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  LOB */../*.** Se
4af0: 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68  t bit pgno of th
4b00: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4b10: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54  ontent bitvec. T
4b20: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a  his is called .*
4b30: 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74 68  * when a page th
4b40: 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f  at previously co
4b50: 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65 63  ntained data bec
4b60: 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74  omes a free-list
4b70: 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a   leaf .** page..
4b80: 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72  **.** The BtShar
4b90: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4ba0: 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f 20  itvec exists to 
4bb0: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f  work around an o
4bc0: 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61  bscure.** bug ca
4bd0: 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74 65  used by the inte
4be0: 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75  raction of two u
4bf0: 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a  seful IO optimiz
4c00: 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69  ations surroundi
4c10: 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  ng.** free-list 
4c20: 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a  leaf pages:.**.*
4c30: 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20  *   1) When all 
4c40: 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64 20  data is deleted 
4c50: 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20  from a page and 
4c60: 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73  the page becomes
4c70: 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d  .**      a free-
4c80: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
4c90: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
4ca0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
4cb0: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
4cc0: 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  (as free-list le
4cd0: 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e  af pages contain
4ce0: 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64   no meaningful d
4cf0: 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a  ata). Sometimes.
4d00: 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20 70  **      such a p
4d10: 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20  age is not even 
4d20: 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69  journalled (as i
4d30: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f  t will not be mo
4d40: 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20  dified,.**      
4d50: 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e  why bother journ
4d60: 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a  alling it?)..**.
4d70: 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20 66  **   2) When a f
4d80: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4d90: 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69 74  ge is reused, it
4da0: 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  s content is not
4db0: 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72   read.**      fr
4dc0: 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
4dd0: 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  or written to th
4de0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
4df0: 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a  why should it.**
4e00: 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74 20        be, if it 
4e10: 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65  is not at all me
4e20: 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a  aningful?)..**.*
4e30: 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c  * By themselves,
4e40: 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
4e50: 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61  ions work fine a
4e60: 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e  nd provide a han
4e70: 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63  dy.** performanc
4e80: 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20  e boost to bulk 
4e90: 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74  delete or insert
4ea0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77   operations. How
4eb0: 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61  ever, if.** a pa
4ec0: 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  ge is moved to t
4ed0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4ee0: 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69 74   then reused wit
4ef0: 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  hin the same.** 
4f00: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70  transaction, a p
4f10: 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e  roblem comes up.
4f20: 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
4f30: 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77  not journalled w
4f40: 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76  hen.** it is mov
4f50: 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c  ed to the free-l
4f60: 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c  ist and it is al
4f70: 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65  so not journalle
4f80: 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20  d when it.** is 
4f90: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74  extracted from t
4fa0: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4fb0: 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68   reused, then th
4fc0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a  e original data.
4fd0: 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20  ** may be lost. 
4fe0: 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  In the event of 
4ff0: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d  a rollback, it m
5000: 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ay not be possib
5010: 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65  le.** to restore
5020: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
5030: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f   its original co
5040: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a  nfiguration..**.
5050: 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20  ** The solution 
5060: 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  is the BtShared.
5070: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
5080: 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70  ec. Whenever a p
5090: 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64  age is .** moved
50a0: 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65   to become a fre
50b0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
50c0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
50d0: 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65  ing bit is.** se
50e0: 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e  t in the bitvec.
50f0: 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66   Whenever a leaf
5100: 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63 74   page is extract
5110: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
5120: 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69  -list,.** optimi
5130: 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69  zation 2 above i
5140: 73 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  s omitted if the
5150: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
5160: 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  it is already.**
5170: 20 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64   set in BtShared
5180: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68  .pHasContent. Th
5190: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
51a0: 65 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65  e bitvec are cle
51b0: 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65  ared.** at the e
51c0: 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e  nd of every tran
51d0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
51e0: 69 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48  ic int btreeSetH
51f0: 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72  asContent(BtShar
5200: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
5210: 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  no){.  int rc = 
5220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
5230: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
5240: 6e 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  nt ){.    assert
5250: 28 20 70 67 6e 6f 3c 3d 70 42 74 2d 3e 6e 50 61  ( pgno<=pBt->nPa
5260: 67 65 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  ge );.    pBt->p
5270: 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c  HasContent = sql
5280: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
5290: 28 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20  (pBt->nPage);.  
52a0: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
52b0: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
52c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
52d0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
52e0: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
52f0: 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d  ITE_OK && pgno<=
5300: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a  sqlite3BitvecSiz
5310: 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  e(pBt->pHasConte
5320: 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nt) ){.    rc = 
5330: 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74  sqlite3BitvecSet
5340: 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  (pBt->pHasConten
5350: 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  t, pgno);.  }.  
5360: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5370: 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42 74  .** Query the Bt
5380: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
5390: 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a  nt vector..**.**
53a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
53b0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
53c0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
53d0: 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20 66  age is removed f
53e0: 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65 2d  rom the.** free-
53f0: 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e 20  list for reuse. 
5400: 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  It returns false
5410: 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20 74   if it is safe t
5420: 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a 2a  o retrieve the.*
5430: 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  * page from the 
5440: 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
5450: 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
5460: 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75 65  ' flag set. True
5470: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
5480: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47  tatic int btreeG
5490: 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  etHasContent(BtS
54a0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
54b0: 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65 63   pgno){.  Bitvec
54c0: 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73 43   *p = pBt->pHasC
54d0: 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72 6e  ontent;.  return
54e0: 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71 6c   (p && (pgno>sql
54f0: 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70  ite3BitvecSize(p
5500: 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76  ) || sqlite3Bitv
5510: 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29 29  ecTest(p, pgno))
5520: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
5530: 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65 20  r (destroy) the 
5540: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
5550: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
5560: 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69  s should be.** i
5570: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
5580: 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63 68  nclusion of each
5590: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
55a0: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
55b0: 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61 73  id btreeClearHas
55c0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
55d0: 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65   *pBt){.  sqlite
55e0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
55f0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29  Bt->pHasContent)
5600: 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e  ;.  pBt->pHasCon
5610: 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tent = 0;.}../*.
5620: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 6f  ** Release all o
5630: 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 70  f the apPage[] p
5640: 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73 6f  ages for a curso
5650: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
5660: 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c  d btreeReleaseAl
5670: 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74 43  lCursorPages(BtC
5680: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5690: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 43 75  int i;.  if( pCu
56a0: 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
56b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
56c0: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
56d0: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
56e0: 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
56f0: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
5700: 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
5710: 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70  eNotNull(pCur->p
5720: 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  Page);.    pCur-
5730: 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 7d  >iPage = -1;.  }
5740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75  .}../*.** The cu
5750: 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  rsor passed as t
5760: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
5770: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
5780: 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20   valid entry.** 
5790: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
57a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e  on is called (i.
57b0: 65 2e 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d  e. have eState==
57c0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54  CURSOR_VALID). T
57d0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
57e0: 73 61 76 65 73 20 74 68 65 20 63 75 72 72 65 6e  saves the curren
57f0: 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20  t cursor key in 
5800: 76 61 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e  variables pCur->
5810: 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72  nKey and.** pCur
5820: 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f  ->pKey. SQLITE_O
5830: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
5840: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61   successful or a
5850: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a  n SQLite error .
5860: 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
5870: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
5880: 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f  cursor is open o
5890: 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  n an intkey tabl
58a0: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65  e, then the inte
58b0: 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20  ger key.** (the 
58c0: 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72 65 64  rowid) is stored
58d0: 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61   in pCur->nKey a
58e0: 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  nd pCur->pKey is
58f0: 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20   left set to.** 
5900: 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72  NULL. If the cur
5910: 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61  sor is open on a
5920: 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c   non-intkey tabl
5930: 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b  e, then pCur->pK
5940: 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f  ey is .** set to
5950: 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c   point to a mall
5960: 6f 63 65 64 20 62 75 66 66 65 72 20 70 43 75 72  oced buffer pCur
5970: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20  ->nKey bytes in 
5980: 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  size containing 
5990: 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a  .** the key..*/.
59a0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
59b0: 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f  ursorKey(BtCurso
59c0: 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
59d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
59e0: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
59f0: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
5a00: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
5a10: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
5a20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
5a30: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
5a40: 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43  ur) );..  if( pC
5a50: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5a60: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65  .    /* Only the
5a70: 20 72 6f 77 69 64 20 69 73 20 72 65 71 75 69 72   rowid is requir
5a80: 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65 20 62  ed for a table b
5a90: 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43 75 72  tree */.    pCur
5aa0: 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ->nKey = sqlite3
5ab0: 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
5ac0: 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
5ad0: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 69 6e      /* For an in
5ae0: 64 65 78 20 62 74 72 65 65 2c 20 73 61 76 65 20  dex btree, save 
5af0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b 65 79  the complete key
5b00: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20   content */.    
5b10: 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20 20 20  void *pKey;.    
5b20: 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c  pCur->nKey = sql
5b30: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5b40: 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 20 20  Size(pCur);.    
5b50: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
5b60: 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65 79  lloc( pCur->nKey
5b70: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79   );.    if( pKey
5b80: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
5b90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5ba0: 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ad(pCur, 0, (int
5bb0: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
5bc0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
5bd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5be0: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5bf0: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5c00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5c10: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
5c20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5c30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
5c40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
5c50: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
5c60: 61 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63  assert( !pCur->c
5c70: 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  urIntKey || !pCu
5c80: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74  r->pKey );.  ret
5c90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5ca0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
5cb0: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
5cc0: 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c  n in the variabl
5cd0: 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79  es BtCursor.nKey
5ce0: 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f   .** and BtCurso
5cf0: 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73  r.pKey. The curs
5d00: 6f 72 27 73 20 73 74 61 74 65 20 69 73 20 73 65  or's state is se
5d10: 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55  t to CURSOR_REQU
5d20: 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54  IRESEEK..**.** T
5d30: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
5d40: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63  nsure that the c
5d50: 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28  ursor is valid (
5d60: 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53  has eState==CURS
5d70: 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69  OR_VALID).** pri
5d80: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
5d90: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f  is routine.  .*/
5da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
5db0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
5dc0: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
5dd0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
5de0: 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
5df0: 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
5e00: 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  || CURSOR_SKIPNE
5e10: 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  XT==pCur->eState
5e20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d   );.  assert( 0=
5e30: 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20  =pCur->pKey );. 
5e40: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
5e50: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
5e60: 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  );..  if( pCur->
5e70: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53  eState==CURSOR_S
5e80: 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70  KIPNEXT ){.    p
5e90: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5ea0: 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
5eb0: 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  lse{.    pCur->s
5ec0: 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  kipNext = 0;.  }
5ed0: 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43 75 72  ..  rc = saveCur
5ee0: 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20  sorKey(pCur);.  
5ef0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5f00: 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65  K ){.    btreeRe
5f10: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
5f20: 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70  ges(pCur);.    p
5f30: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
5f40: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
5f50: 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63  ;.  }..  pCur->c
5f60: 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
5f70: 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
5f80: 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
5f90: 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72  AtLast);.  retur
5fa0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
5fb0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
5fd0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65  TE_NOINLINE save
5fe0: 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74  CursorsOnList(Bt
5ff0: 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43  Cursor*,Pgno,BtC
6000: 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20  ursor*);../*.** 
6010: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
6020: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
6030: 73 20 28 65 78 63 65 70 74 20 70 45 78 63 65 70  s (except pExcep
6040: 74 29 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  t) that are open
6050: 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   on.** the table
6060: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
6070: 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20  iRoot.  "Saving 
6080: 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74  the cursor posit
6090: 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a  ion" means that.
60a0: 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20  ** the location 
60b0: 69 6e 20 74 68 65 20 62 74 72 65 65 20 69 73 20  in the btree is 
60c0: 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75  remembered in su
60d0: 63 68 20 61 20 77 61 79 20 74 68 61 74 20 69 74  ch a way that it
60e0: 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64   can be.** moved
60f0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d   back to the sam
6100: 65 20 73 70 6f 74 20 61 66 74 65 72 20 74 68 65  e spot after the
6110: 20 62 74 72 65 65 20 68 61 73 20 62 65 65 6e 20   btree has been 
6120: 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a  modified.  This.
6130: 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
6140: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
6150: 20 63 75 72 73 6f 72 20 70 45 78 63 65 70 74 20   cursor pExcept 
6160: 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66  is used to modif
6170: 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20  y the.** table, 
6180: 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42  for example in B
6190: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
61a0: 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a  BtreeInsert()..*
61b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
61c0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
61d0: 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
61e0: 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
61f0: 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f  l such .** curso
6200: 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74  rs should have t
6210: 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70  heir BTCF_Multip
6220: 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68  le flag set.  Th
6230: 65 20 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a  e btreeCursor().
6240: 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72  ** routine enfor
6250: 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20  ces that rule.  
6260: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  This routine onl
6270: 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61  y needs to be ca
6280: 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lled in.** the u
6290: 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65  ncommon case whe
62a0: 6e 20 70 45 78 70 65 63 74 20 68 61 73 20 74 68  n pExpect has th
62b0: 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
62c0: 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  flag set..**.** 
62d0: 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c  If pExpect!=NULL
62e0: 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72   and if no other
62f0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75   cursors are fou
6300: 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72  nd on the same r
6310: 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65  oot-page,.** the
6320: 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69  n the BTCF_Multi
6330: 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70  ple flag on pExp
6340: 65 63 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ect is cleared, 
6350: 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72  to avoid another
6360: 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61  .** pointless ca
6370: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
6380: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  ne..**.** Implem
6390: 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20  entation note:  
63a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72  This routine mer
63b0: 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ely checks to se
63c0: 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73  e if any cursors
63d0: 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73  .** need to be s
63e0: 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20  aved.  It calls 
63f0: 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f  out to saveCurso
6400: 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68  rsOnList() in th
6410: 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65  e (unusual).** e
6420: 76 65 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72  vent that cursor
6430: 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f  s are in need to
6440: 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f   being saved..*/
6450: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
6460: 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61  AllCursors(BtSha
6470: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69  red *pBt, Pgno i
6480: 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a  Root, BtCursor *
6490: 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75  pExcept){.  BtCu
64a0: 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72  rsor *p;.  asser
64b0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
64c0: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
64d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
64e0: 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78  Except==0 || pEx
64f0: 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29  cept->pBt==pBt )
6500: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
6510: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
6520: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
6530: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
6540: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
6550: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
6560: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
6570: 28 20 70 20 29 20 72 65 74 75 72 6e 20 73 61 76  ( p ) return sav
6580: 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70  eCursorsOnList(p
6590: 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74  , iRoot, pExcept
65a0: 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65 70 74  );.  if( pExcept
65b0: 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46   ) pExcept->curF
65c0: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75  lags &= ~BTCF_Mu
65d0: 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e  ltiple;.  return
65e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
65f0: 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f  * This helper ro
6600: 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c  utine to saveAll
6610: 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65  Cursors does the
6620: 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20   actual work of 
6630: 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75  saving.** the cu
6640: 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65  rsors if and whe
6650: 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f  n a cursor is fo
6660: 75 6e 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c  und that actuall
6670: 79 20 72 65 71 75 69 72 65 73 20 73 61 76 69 6e  y requires savin
6680: 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  g..** The common
6690: 20 63 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f   case is that no
66a0: 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f   cursors need to
66b0: 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68   be saved, so th
66c0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a  is routine is.**
66d0: 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d   broken out from
66e0: 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61   its caller to a
66f0: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79  void unnecessary
6700: 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d   stack pointer m
6710: 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  ovement..*/.stat
6720: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
6730: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
6740: 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75  rsOnList(.  BtCu
6750: 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20  rsor *p,        
6760: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 75   /* The first cu
6770: 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20  rsor that needs 
6780: 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f  saving */.  Pgno
6790: 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20   iRoot,         
67a0: 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75   /* Only save cu
67b0: 72 73 6f 72 20 77 69 74 68 20 74 68 69 73 20 69  rsor with this i
67c0: 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69  Root. Save all i
67d0: 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75  f zero */.  BtCu
67e0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20  rsor *pExcept   
67f0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20   /* Do not save 
6800: 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29  this cursor */.)
6810: 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20  {.  do{.    if( 
6820: 70 21 3d 70 45 78 63 65 70 74 20 26 26 20 28 30  p!=pExcept && (0
6830: 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67  ==iRoot || p->pg
6840: 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29  noRoot==iRoot) )
6850: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65  {.      if( p->e
6860: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6870: 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
6880: 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
6890: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  T ){.        int
68a0: 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
68b0: 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
68c0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
68d0: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
68e0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
68f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
6910: 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65  stcase( p->iPage
6920: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62  >=0 );.        b
6930: 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75  treeReleaseAllCu
6940: 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20  rsorPages(p);.  
6950: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6960: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
6970: 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72  }while( p );.  r
6980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
69a0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
69b0: 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a  or position..*/.
69c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
69d0: 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43  eClearCursor(BtC
69e0: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
69f0: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
6a00: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
6a10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
6a20: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
6a30: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6a40: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
6a50: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
6a60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69  .}../*.** In thi
6a70: 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72  s version of Btr
6a80: 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69  eeMoveto, pKey i
6a90: 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78  s a packed index
6aa0: 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20   record.** such 
6ab0: 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  as is generated 
6ac0: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
6ad0: 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e  cord opcode.  Un
6ae0: 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f  pack the.** reco
6af0: 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c  rd and then call
6b00: 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61   BtreeMovetoUnpa
6b10: 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65  cked() to do the
6b20: 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   work..*/.static
6b30: 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f   int btreeMoveto
6b40: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
6b50: 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  ur,     /* Curso
6b60: 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74  r open on the bt
6b70: 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63 68  ree to be search
6b80: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ed */.  const vo
6b90: 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50  id *pKey,   /* P
6ba0: 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65  acked key if the
6bb0: 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64   btree is an ind
6bc0: 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ex */.  i64 nKey
6bd0: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
6be0: 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74  nteger key for t
6bf0: 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20  ables.  Size of 
6c00: 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73  pKey for indices
6c10: 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20   */.  int bias, 
6c20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61            /* Bia
6c30: 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  s search to the 
6c40: 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
6c50: 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
6c60: 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63    /* Write searc
6c70: 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  h results here *
6c80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65    /* Status code
6cb0: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
6cc0: 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20  cord *pIdxKey;  
6cd0: 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
6ce0: 65 78 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28  ex key */..  if(
6cf0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
6d00: 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
6d10: 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
6d20: 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
6d30: 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63  e3VdbeAllocUnpac
6d40: 6b 65 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e  kedRecord(pCur->
6d50: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6d60: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6d70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6d80: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6d90: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6da0: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
6db0: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
6dc0: 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b   pKey, pIdxKey);
6dd0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
6de0: 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20  ->nField==0 ){. 
6df0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6e00: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
6e10: 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
6e20: 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  _done;.    }.  }
6e30: 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65  else{.    pIdxKe
6e40: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20  y = 0;.  }.  rc 
6e50: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
6e60: 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75  vetoUnpacked(pCu
6e70: 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79  r, pIdxKey, nKey
6e80: 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d  , bias, pRes);.m
6e90: 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66  oveto_done:.  if
6ea0: 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20  ( pIdxKey ){.   
6eb0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6ec0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
6ed0: 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  b, pIdxKey);.  }
6ee0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
6ef0: 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74  ./*.** Restore t
6f00: 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
6f10: 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73   position it was
6f20: 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65   in (or as close
6f30: 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29   to as possible)
6f40: 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72  .** when saveCur
6f50: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61  sorPosition() wa
6f60: 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74  s called. Note t
6f70: 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65  hat this call de
6f80: 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61  letes the .** sa
6f90: 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66  ved position inf
6fa0: 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65  o stored by save
6fb0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6fc0: 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62  , so there can b
6fd0: 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65  e.** at most one
6fe0: 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f   effective resto
6ff0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
7000: 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61  () call after ea
7010: 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f  ch .** saveCurso
7020: 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a  rPosition()..*/.
7030: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
7040: 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
7050: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
7060: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
7070: 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b  .  int skipNext;
7080: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
7090: 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
70a0: 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
70b0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
70c0: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
70d0: 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
70e0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
70f0: 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
7100: 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  urn pCur->skipNe
7110: 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  xt;.  }.  pCur->
7120: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7130: 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20  INVALID;.  rc = 
7140: 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
7150: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
7160: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b  ur->nKey, 0, &sk
7170: 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72  ipNext);.  if( r
7180: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7190: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
71a0: 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20  (pCur->pKey);.  
71b0: 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30    pCur->pKey = 0
71c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
71d0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
71e0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
71f0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7200: 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  _INVALID );.    
7210: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c  pCur->skipNext |
7220: 3d 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20  = skipNext;.    
7230: 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
7240: 78 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  xt && pCur->eSta
7250: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
7260: 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
7270: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
7280: 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a  SKIPNEXT;.    }.
7290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
72a0: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
72b0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
72c0: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
72d0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
72e0: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
72f0: 20 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72       btreeRestor
7300: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7310: 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20  p) : \.         
7320: 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a  SQLITE_OK)../*.*
7330: 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74  * Determine whet
7340: 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72  her or not a cur
7350: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72  sor has moved fr
7360: 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  om the position 
7370: 77 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20  where.** it was 
7380: 6c 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20  last placed, or 
7390: 68 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  has been invalid
73a0: 61 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68  ated for any oth
73b0: 65 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75  er reason..** Cu
73c0: 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77  rsors can move w
73d0: 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79  hen the row they
73e0: 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74   are pointing at
73f0: 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a   is deleted out.
7400: 2a 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ** from under th
7410: 65 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e  em, for example.
7420: 20 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61    Cursor might a
7430: 6c 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74  lso move if a bt
7440: 72 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61  ree.** is rebala
7450: 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  nced..**.** Call
7460: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
7470: 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72   with a NULL cur
7480: 73 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75  sor pointer retu
7490: 72 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a  rns false..**.**
74a0: 20 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74   Use the separat
74b0: 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
74c0: 72 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f  rsorRestore() ro
74d0: 75 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65  utine to restore
74e0: 20 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63   a cursor.** bac
74f0: 6b 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75  k to where it ou
7500: 67 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69  ght to be if thi
7510: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
7520: 73 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73  s true..*/.int s
7530: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7540: 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73  rHasMoved(BtCurs
7550: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74  or *pCur){.  ret
7560: 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
7570: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  !=CURSOR_VALID;.
7580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7590: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
75a0: 61 6b 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  ake BtCursor obj
75b0: 65 63 74 20 74 68 61 74 20 77 69 6c 6c 20 61 6c  ect that will al
75c0: 77 61 79 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66  ways answer.** f
75d0: 61 6c 73 65 20 74 6f 20 74 68 65 20 73 71 6c 69  alse to the sqli
75e0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
75f0: 73 4d 6f 76 65 64 28 29 20 72 6f 75 74 69 6e 65  sMoved() routine
7600: 20 61 62 6f 76 65 2e 20 20 54 68 65 20 66 61 6b   above.  The fak
7610: 65 0a 2a 2a 20 63 75 72 73 6f 72 20 72 65 74 75  e.** cursor retu
7620: 72 6e 65 64 20 6d 75 73 74 20 6e 6f 74 20 62 65  rned must not be
7630: 20 75 73 65 64 20 77 69 74 68 20 61 6e 79 20 6f   used with any o
7640: 74 68 65 72 20 42 74 72 65 65 20 69 6e 74 65 72  ther Btree inter
7650: 66 61 63 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f  face..*/.BtCurso
7660: 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 46  r *sqlite3BtreeF
7670: 61 6b 65 56 61 6c 69 64 43 75 72 73 6f 72 28 76  akeValidCursor(v
7680: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 75  oid){.  static u
7690: 38 20 66 61 6b 65 43 75 72 73 6f 72 20 3d 20 43  8 fakeCursor = C
76a0: 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61  URSOR_VALID;.  a
76b0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f 66 28  ssert( offsetof(
76c0: 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61 74 65  BtCursor, eState
76d0: 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
76e0: 20 28 42 74 43 75 72 73 6f 72 2a 29 26 66 61 6b   (BtCursor*)&fak
76f0: 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  eCursor;.}../*.*
7700: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7710: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
7720: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
7730: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
7740: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
7750: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
7760: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
7770: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
7780: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
7790: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
77a0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
77b0: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
77c0: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
77d0: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
77e0: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
77f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7800: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
7810: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
7820: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
7830: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
7840: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
7850: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
7860: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
7870: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
7880: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
7890: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
78a0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
78b0: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
78c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
78d0: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
78e0: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
78f0: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7900: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
7910: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
7920: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
7930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7940: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
7950: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
7960: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
7970: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
7980: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
7990: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
79a0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
79b0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
79c0: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
79d0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
79e0: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
79f0: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7a00: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7a10: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
7a20: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
7a30: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
7a40: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
7a50: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
7a60: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
7a70: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
7a80: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
7a90: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
7aa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7ab0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7ac0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7ad0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7ae0: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7af0: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7b00: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
7b10: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
7b20: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
7b30: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
7b40: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
7b50: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
7b60: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
7b70: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
7b80: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
7b90: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
7ba0: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7bb0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7bc0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7bd0: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7be0: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7bf0: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7c00: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
7c10: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
7c20: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
7c30: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
7c40: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
7c50: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
7c60: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
7c70: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
7c80: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
7c90: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
7ca0: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7cb0: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7cc0: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7cd0: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7ce0: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7cf0: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7d00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7d10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
7d20: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
7d30: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
7d40: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
7d50: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
7d60: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
7d70: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
7d80: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
7d90: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
7da0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7db0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7dc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7dd0: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7de0: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7df0: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7e00: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
7e10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
7e20: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
7e30: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
7e40: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
7e50: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
7e60: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
7e70: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
7e80: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
7e90: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
7ea0: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7eb0: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7ec0: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7ed0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7ee0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7ef0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7f00: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
7f10: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
7f20: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
7f30: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
7f40: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
7f50: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
7f60: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
7f70: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
7f80: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
7f90: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
7fa0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7fb0: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7fc0: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7fd0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7fe0: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7ff0: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
8000: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8010: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
8020: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
8030: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
8040: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
8050: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
8060: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
8070: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
8080: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
8090: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
80a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
80b0: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
80c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
80d0: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
80e0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
80f0: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8100: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
8110: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
8120: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
8130: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
8140: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
8150: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
8160: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
8170: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
8180: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
8190: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
81a0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
81b0: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
81c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
81d0: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
81e0: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
81f0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8200: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
8210: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8220: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
8230: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8240: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
8250: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
8260: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
8270: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
8280: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
8290: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
82a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
82b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
82c0: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
82d0: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
82e0: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
82f0: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
8300: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
8310: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
8320: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
8330: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8340: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
8350: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
8360: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
8370: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
8380: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8390: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
83a0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
83b0: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
83c0: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
83d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
83e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
83f0: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
8400: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
8410: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8420: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
8430: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
8440: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
8450: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
8460: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
8470: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
8480: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
8490: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
84a0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
84b0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
84c0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
84d0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
84e0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
84f0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8500: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8510: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
8520: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
8530: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
8540: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
8550: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
8560: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
8570: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
8580: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
8590: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
85a0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
85b0: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
85c0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
85d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
85e0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
85f0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
8600: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
8610: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
8620: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
8630: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
8640: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
8650: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
8660: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
8670: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
8680: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
8690: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
86a0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
86b0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
86c0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
86d0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
86e0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
86f0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8700: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8710: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8720: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8730: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8740: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
8750: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
8760: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
8770: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
8780: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8790: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
87a0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
87b0: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
87c0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
87d0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
87e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
87f0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8800: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8810: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8820: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8830: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8840: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
8850: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
8860: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
8870: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
8880: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
8890: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
88a0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
88b0: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
88c0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
88d0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
88e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
88f0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8900: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8910: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8920: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8930: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8940: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
8950: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
8960: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
8970: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
8980: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
8990: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
89a0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
89b0: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
89c0: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
89d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
89e0: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
89f0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8a00: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8a10: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8a20: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8a30: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8a40: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
8a50: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
8a60: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
8a70: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8a80: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
8a90: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
8aa0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8ab0: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8ac0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8ad0: 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 50 74  CORRUPT_PGNO(iPt
8ae0: 72 6d 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  rmap);.  return 
8af0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
8b00: 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69 6e 65  lse /* if define
8b10: 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  d SQLITE_OMIT_AU
8b20: 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64  TOVACUUM */.  #d
8b30: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 28  efine ptrmapPut(
8b40: 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64  w,x,y,z,rc).  #d
8b50: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
8b60: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
8b70: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
8b80: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c  mapPutOvflPtr(x,
8b90: 20 79 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   y, rc).#endif..
8ba0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8bb0: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8bc0: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8bd0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8be0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8bf0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8c00: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8c10: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8c20: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8c30: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8c40: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
8c50: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8c60: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8c70: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8c80: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8c90: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8ca0: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8cb0: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8cc0: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8cd0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8ce0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8cf0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
8d00: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
8d10: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
8d20: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
8d30: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
8d40: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
8d50: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
8d60: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
8d70: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
8d80: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
8d90: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
8da0: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
8db0: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
8dc0: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
8dd0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
8de0: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
8df0: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
8e00: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
8e10: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
8e20: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
8e30: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8e40: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
8e50: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
8e60: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
8e70: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
8e80: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
8e90: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
8ea0: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
8eb0: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
8ec0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
8ed0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
8ee0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
8ef0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
8f00: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
8f10: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
8f20: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8f30: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8f40: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8f50: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8f60: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8f70: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8f80: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8f90: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8fa0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8fb0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8fc0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
8fd0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
8fe0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
8ff0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
9000: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
9010: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
9020: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9030: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
9040: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
9050: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
9060: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
9070: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
9080: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
9090: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
90a0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
90b0: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
90c0: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
90d0: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
90e0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
90f0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
9100: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
9110: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
9120: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9130: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
9140: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
9150: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
9160: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
9170: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
9180: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
9190: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
91a0: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
91b0: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
91c0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
91d0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
91e0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
91f0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
9200: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
9210: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
9220: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9230: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9240: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
9250: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9260: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
9270: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
9280: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
9290: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
92a0: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
92b0: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
92c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
92d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
92e0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
92f0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
9300: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
9310: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
9320: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9330: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
9340: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
9350: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
9360: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9370: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
9380: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
9390: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
93a0: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
93b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
93c0: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
93d0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
93e0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
93f0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
9400: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
9410: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
9420: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
9430: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
9440: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
9450: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
9460: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
9470: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9480: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
9490: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
94a0: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
94b0: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
94c0: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
94d0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
94e0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
94f0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
9500: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
9510: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
9520: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
9530: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
9540: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
9550: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
9560: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
9570: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
9580: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
9590: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
95a0: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
95b0: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
95c0: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
95d0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
95e0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
95f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9600: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9610: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9620: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9630: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9640: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9650: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9660: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9670: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9680: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9690: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
96a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
96b0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
96c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
96d0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
96e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
96f0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
9700: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
9710: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
9720: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
9730: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
9740: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
9750: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9760: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9770: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9780: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9790: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
97a0: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
97b0: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
97c0: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
97d0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
97e0: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
97f0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9800: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9810: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9820: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9840: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9850: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9860: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9870: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9880: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9890: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98b0: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
98c0: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
98d0: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
98e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
98f0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9900: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
9910: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
9920: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
9930: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
9940: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9950: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9960: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9970: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9980: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9990: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
99a0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
99b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
99c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
99d0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
99e0: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
99f0: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
9a00: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9a10: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
9a20: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
9a30: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
9a40: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
9a50: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9a60: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9a70: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9a80: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9a90: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9aa0: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9ab0: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9ac0: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9ad0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9ae0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9af0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9b00: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9b10: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9b20: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9b30: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
9b40: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
9b50: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9b60: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9b70: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9b80: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9b90: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9ba0: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9bb0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9bc0: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9bd0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9be0: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9bf0: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9c00: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9c10: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
9c20: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
9c30: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
9c40: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9c50: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9c60: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9c70: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9c80: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9c90: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9ca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9cb0: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9cc0: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9cd0: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9ce0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9cf0: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
9d00: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9d10: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9d20: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
9d30: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
9d40: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
9d50: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
9d60: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
9d70: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
9d80: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
9d90: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9da0: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
9db0: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
9dc0: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
9dd0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
9de0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
9df0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9e00: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
9e10: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
9e20: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
9e30: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
9e40: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
9e50: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
9e60: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
9e70: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
9e80: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
9e90: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
9ea0: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
9eb0: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
9ec0: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
9ed0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
9ee0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
9ef0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
9f00: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
9f10: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
9f20: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
9f30: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
9f40: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
9f50: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9f60: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
9f70: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9f80: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9f90: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9fa0: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9fb0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9fc0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9fd0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
9fe0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
9ff0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a000: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a010: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a020: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a030: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a040: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a050: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a060: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a070: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a080: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a090: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
a0a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a0b0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a0c0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a0d0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
a0e0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
a0f0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
a100: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
a110: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
a120: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a130: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a140: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
a150: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
a160: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
a170: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
a180: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
a190: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
a1a0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
a1b0: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
a1c0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a1d0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a1e0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a1f0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a200: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a210: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
a220: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
a230: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
a240: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a250: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
a260: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
a270: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
a280: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a290: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
a2a0: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
a2b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a2c0: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
a2d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a2e0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
a2f0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
a300: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
a310: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
a320: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
a330: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
a340: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
a350: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a360: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a370: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
a380: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a390: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
a3a0: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
a3b0: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
a3c0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a3d0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
a3e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
a3f0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
a400: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
a410: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
a420: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
a430: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
a440: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
a450: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a460: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a470: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a480: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a4a0: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
a4b0: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
a4c0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a4d0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a4e0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a4f0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
a500: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a510: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
a520: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
a530: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
a540: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a550: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a560: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a570: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
a580: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
a590: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
a5a0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a5b0: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
a5c0: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
a5d0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
a5e0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
a5f0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
a600: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
a610: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
a620: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
a630: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
a640: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
a650: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
a660: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
a670: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
a680: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
a690: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a6a0: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
a6b0: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
a6c0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
a6d0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
a6e0: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
a6f0: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
a700: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
a710: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
a720: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a730: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a740: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a750: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
a760: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
a770: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
a780: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
a790: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
a7c0: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
a7d0: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
a7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a800: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
a810: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
a820: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
a830: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
a840: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
a850: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
a860: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
a870: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
a880: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
a890: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
a8a0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
a8b0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
a8c0: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
a8d0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
a8e0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
a8f0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
a900: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
a910: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
a920: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
a930: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
a940: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
a950: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
a960: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
a970: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
a980: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
a990: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
a9a0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
a9b0: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
a9c0: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
a9d0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
a9e0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
a9f0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
aa00: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
aa10: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
aa20: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
aa30: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
aa40: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
aa50: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
aa60: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
aa70: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
aa80: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
aa90: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
aaa0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
aab0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
aac0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
aad0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
aae0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
aaf0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
ab00: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
ab10: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
ab20: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
ab30: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
ab40: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
ab50: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ab60: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
ab70: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
ab80: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
ab90: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
aba0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
abb0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
abc0: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
abd0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
abe0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
abf0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
ac00: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
ac10: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
ac20: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
ac30: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
ac40: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
ac50: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
ac60: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
ac70: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
ac80: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
ac90: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
aca0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
acb0: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
acc0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
acd0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
ace0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
acf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
ad00: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
ad10: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
ad20: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
ad30: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
ad40: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
ad50: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
ad60: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
ad70: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
ad80: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
ad90: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
ada0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
adb0: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
adc0: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
add0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
ade0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
adf0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
ae00: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
ae10: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
ae20: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
ae30: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
ae40: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
ae50: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
ae60: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
ae70: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
ae80: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
ae90: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
aea0: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
aeb0: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
aec0: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
aed0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
aee0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
aef0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
af00: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
af10: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
af20: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
af30: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
af40: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
af50: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
af60: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
af70: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
af80: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
af90: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
afa0: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
afb0: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
afc0: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
afd0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
afe0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
aff0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
b000: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
b010: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
b020: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
b030: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
b040: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
b050: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
b060: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
b070: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b080: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
b090: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
b0a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b0b0: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
b0c0: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
b0d0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
b0e0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
b0f0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
b100: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
b110: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
b120: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
b130: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
b140: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b150: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
b160: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
b170: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b180: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b190: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
b1a0: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
b1b0: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
b1c0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
b1d0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
b1e0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
b1f0: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
b200: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
b210: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
b220: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
b230: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
b240: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
b250: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
b260: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
b270: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
b280: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
b290: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
b2a0: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
b2b0: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
b2c0: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
b2d0: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
b2e0: 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66   info.nLocal<inf
b2f0: 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20  o.nPayload ){.  
b300: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
b310: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
b320: 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20 20  fo.nSize-4]);.  
b330: 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67    ptrmapPut(pPag
b340: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
b350: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
b360: 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52 43  pPage->pgno, pRC
b370: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
b380: 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65  ../*.** Defragme
b390: 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76 65  nt the page give
b3a0: 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  n. This routine 
b3b0: 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c 6c  reorganizes cell
b3c0: 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  s within the.** 
b3d0: 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68 65  page so that the
b3e0: 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d 62  re are no free-b
b3f0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72 65  locks on the fre
b400: 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a 2a  e-block list..**
b410: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 4d  .** Parameter nM
b420: 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d 61  axFrag is the ma
b430: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
b440: 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65  fragmented space
b450: 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20   that may be.** 
b460: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 70  present in the p
b470: 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20 72  age after this r
b480: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e 0a  outine returns..
b490: 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f  **.** EVIDENCE-O
b4a0: 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33 38  F: R-44582-60138
b4b0: 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d   SQLite may from
b4c0: 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72 65   time to time re
b4d0: 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d  organize a.** b-
b4e0: 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68 61  tree page so tha
b4f0: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 66  t there are no f
b500: 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61  reeblocks or fra
b510: 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c  gment bytes, all
b520: 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65 73  .** unused bytes
b530: 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69   are contained i
b540: 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65  n the unallocate
b550: 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c 20  d space region, 
b560: 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73  and all.** cells
b570: 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67 68   are packed tigh
b580: 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  tly at the end o
b590: 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  f the page..*/.s
b5a0: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
b5b0: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
b5c0: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d 61   *pPage, int nMa
b5d0: 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69 3b  xFrag){.  int i;
b5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
b600: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
b610: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b620: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
b630: 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  of the i-th cell
b640: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
b670: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
b680: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b6a0: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
b6b0: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
b6c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
b6d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
b6e0: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
b6f0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
b700: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
b710: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
b720: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
b730: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
b740: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
b750: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
b760: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
b770: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
b780: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
b790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b7a0: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
b7b0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
b7c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
b7d0: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
b7e0: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
b7f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
b800: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
b810: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
b820: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e   content */.  un
b830: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63  signed char *src
b840: 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72  ;        /* Sour
b850: 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f  ce of content */
b860: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73  .  int iCellFirs
b870: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b880: 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65   First allowable
b890: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
b8a0: 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20   int iCellLast; 
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b8c0: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
b8d0: 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61 73  l index */..  as
b8e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b8f0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b900: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b910: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b920: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b930: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b940: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
b950: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b960: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
b970: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
b980: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
b990: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b9a0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b9b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
b9c0: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
b9d0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b9e0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
b9f0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
ba00: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
ba10: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
ba20: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
ba30: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
ba40: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
ba50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
ba60: 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   );.  iCellFirst
ba70: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
ba80: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c  2*nCell;.  usabl
ba90: 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70  eSize = pPage->p
baa0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
bab0: 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b  .  /* This block
bac0: 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20 77   handles pages w
bad0: 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65 72  ith two or fewer
bae0: 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e 64   free blocks and
baf0: 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20 6f   nMaxFrag.  ** o
bb00: 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e 74  r fewer fragment
bb10: 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68 69  ed bytes. In thi
bb20: 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61 73  s case it is fas
bb30: 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65 0a  ter to move the.
bb40: 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e 65    ** two (or one
bb50: 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c 6c  ) blocks of cell
bb60: 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65 28  s using memmove(
bb70: 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 65  ) and add the re
bb80: 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66 73  quired.  ** offs
bb90: 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69 6e  ets to each poin
bba0: 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d  ter in the cell-
bbb0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74 68  pointer array th
bbc0: 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20 2a  an it is to .  *
bbd0: 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74 68  * reconstruct th
bbe0: 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20 20  e entire page.  
bbf0: 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64 61  */.  if( (int)da
bc00: 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78 46  ta[hdr+7]<=nMaxF
bc10: 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  rag ){.    int i
bc20: 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65 28  Free = get2byte(
bc30: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
bc40: 20 20 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a     if( iFree ){.
bc50: 20 20 20 20 20 20 69 6e 74 20 69 46 72 65 65 32        int iFree2
bc60: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
bc70: 61 5b 69 46 72 65 65 5d 29 3b 0a 0a 20 20 20 20  a[iFree]);..    
bc80: 20 20 2f 2a 20 70 61 67 65 46 69 6e 64 53 6c 6f    /* pageFindSlo
bc90: 74 28 29 20 68 61 73 20 61 6c 72 65 61 64 79 20  t() has already 
bca0: 76 65 72 69 66 69 65 64 20 74 68 61 74 20 66 72  verified that fr
bcb0: 65 65 20 62 6c 6f 63 6b 73 20 61 72 65 20 73 6f  ee blocks are so
bcc0: 72 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rted.      ** in
bcd0: 20 6f 72 64 65 72 20 6f 66 20 6f 66 66 73 65 74   order of offset
bce0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
bcf0: 2c 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 62 6c  , and that no bl
bd00: 6f 63 6b 20 65 78 74 65 6e 64 73 0a 20 20 20 20  ock extends.    
bd10: 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e    ** past the en
bd20: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 50  d of the page. P
bd30: 72 6f 76 69 64 65 64 20 74 68 65 20 74 77 6f 20  rovided the two 
bd40: 66 72 65 65 20 73 6c 6f 74 73 20 64 6f 20 6e 6f  free slots do no
bd50: 74 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72  t .      ** over
bd60: 6c 61 70 2c 20 74 68 69 73 20 67 75 61 72 61 6e  lap, this guaran
bd70: 74 65 65 73 20 74 68 61 74 20 74 68 65 20 6d 65  tees that the me
bd80: 6d 6d 6f 76 65 28 29 20 63 61 6c 6c 73 20 62 65  mmove() calls be
bd90: 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
bda0: 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 65 20     ** overwrite 
bdb0: 74 68 65 20 75 73 61 62 6c 65 53 69 7a 65 20 62  the usableSize b
bdc0: 79 74 65 20 62 75 66 66 65 72 2c 20 65 76 65 6e  yte buffer, even
bdd0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
bde0: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
bdf0: 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f 0a 20  s corrupt.  */. 
be00: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
be10: 65 65 32 3d 3d 30 20 7c 7c 20 69 46 72 65 65 32  ee2==0 || iFree2
be20: 3e 69 46 72 65 65 20 29 3b 0a 20 20 20 20 20 20  >iFree );.      
be30: 61 73 73 65 72 74 28 20 69 46 72 65 65 2b 67 65  assert( iFree+ge
be40: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
be50: 65 65 2b 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65  ee+2]) <= usable
be60: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61 73  Size );.      as
be70: 73 65 72 74 28 20 69 46 72 65 65 32 3d 3d 30 20  sert( iFree2==0 
be80: 7c 7c 20 69 46 72 65 65 32 2b 67 65 74 32 62 79  || iFree2+get2by
be90: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 32 2b  te(&data[iFree2+
bea0: 32 5d 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a  2]) <= usableSiz
beb0: 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  e );..      if( 
bec0: 30 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61  0==iFree2 || (da
bed0: 74 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26  ta[iFree2]==0 &&
bee0: 20 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d   data[iFree2+1]=
bef0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75  =0) ){.        u
bf00: 38 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b  8 *pEnd = &data[
bf10: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
bf20: 6c 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75  ll*2];.        u
bf30: 38 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20  8 *pAddr;.      
bf40: 20 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20    int sz2 = 0;. 
bf50: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
bf60: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
bf70: 46 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20  Free+2]);.      
bf80: 20 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32    int top = get2
bf90: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
bfa0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
bfb0: 74 6f 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20  top>=iFree ){.  
bfc0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
bfd0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
bfe0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
bff0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
c000: 20 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20   iFree2 ){.     
c010: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
c020: 65 65 2b 73 7a 3c 3d 69 46 72 65 65 32 20 29 3b  ee+sz<=iFree2 );
c030: 20 2f 2a 20 56 65 72 69 66 69 65 64 20 62 79 20   /* Verified by 
c040: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 29 20 2a  pageFindSlot() *
c050: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 32 20  /.          sz2 
c060: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c070: 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20 20 20  [iFree2+2]);.   
c080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
c090: 46 72 65 65 2b 73 7a 2b 73 7a 32 2b 69 46 72 65  Free+sz+sz2+iFre
c0a0: 65 32 2d 28 69 46 72 65 65 2b 73 7a 29 20 3c 3d  e2-(iFree+sz) <=
c0b0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
c0c0: 20 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65           memmove
c0d0: 28 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 2b  (&data[iFree+sz+
c0e0: 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69 46 72 65  sz2], &data[iFre
c0f0: 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32 2d 28 69  e+sz], iFree2-(i
c100: 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20 20 20 20  Free+sz));.     
c110: 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a 32 3b 0a       sz += sz2;.
c120: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c130: 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b 73 7a 3b    cbrk = top+sz;
c140: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c150: 20 63 62 72 6b 2b 28 69 46 72 65 65 2d 74 6f 70   cbrk+(iFree-top
c160: 29 20 3c 3d 20 75 73 61 62 6c 65 53 69 7a 65 20  ) <= usableSize 
c170: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
c180: 76 65 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ve(&data[cbrk], 
c190: 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69 46 72 65  &data[top], iFre
c1a0: 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  e-top);.        
c1b0: 66 6f 72 28 70 41 64 64 72 3d 26 64 61 74 61 5b  for(pAddr=&data[
c1c0: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 41 64  cellOffset]; pAd
c1d0: 64 72 3c 70 45 6e 64 3b 20 70 41 64 64 72 2b 3d  dr<pEnd; pAddr+=
c1e0: 32 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 63  2){.          pc
c1f0: 20 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64   = get2byte(pAdd
c200: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  r);.          if
c210: 28 20 70 63 3c 69 46 72 65 65 20 29 7b 20 70 75  ( pc<iFree ){ pu
c220: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 70 63  t2byte(pAddr, pc
c230: 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20 20 20 20  +sz); }.        
c240: 20 20 65 6c 73 65 20 69 66 28 20 70 63 3c 69 46    else if( pc<iF
c250: 72 65 65 32 20 29 7b 20 70 75 74 32 62 79 74 65  ree2 ){ put2byte
c260: 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 32 29 3b  (pAddr, pc+sz2);
c270: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
c280: 20 20 20 20 20 67 6f 74 6f 20 64 65 66 72 61 67       goto defrag
c290: 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ment_out;.      
c2a0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 63  }.    }.  }..  c
c2b0: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
c2c0: 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20  ;.  iCellLast = 
c2d0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
c2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
c2f0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
c300: 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20   *pAddr;     /* 
c310: 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f  The i-th cell po
c320: 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64  inter */.    pAd
c330: 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  dr = &data[cellO
c340: 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20  ffset + i*2];.  
c350: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
c360: 70 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74  pAddr);.    test
c370: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
c380: 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
c390: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
c3a0: 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68  ast );.    /* Th
c3b0: 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68  ese conditions h
c3c0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
c3d0: 20 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72   verified in btr
c3e0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
c3f0: 20 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65   ** if PRAGMA ce
c400: 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e  ll_size_check=ON
c410: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c420: 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c   pc<iCellFirst |
c430: 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  | pc>iCellLast )
c440: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
c450: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
c460: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
c470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 63 3e  .    assert( pc>
c480: 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26 20 70  =iCellFirst && p
c490: 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c<=iCellLast );.
c4a0: 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61 67 65      size = pPage
c4b0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
c4c0: 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a 20 20  e, &src[pc]);.  
c4d0: 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a    cbrk -= size;.
c4e0: 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65      if( cbrk<iCe
c4f0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b 73 69  llFirst || pc+si
c500: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
c510: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c520: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c530: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
c540: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c550: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
c560: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
c570: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
c580: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
c590: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c5a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
c5b0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
c5c0: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
c5d0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
c5e0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
c5f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
c600: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
c610: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
c620: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
c630: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
c640: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
c650: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
c660: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c670: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
c680: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
c690: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
c6a0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
c6b0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
c6c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
c6d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
c6e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
c6f0: 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d  .  data[hdr+7] =
c700: 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d 65 6e 74   0;.. defragment
c710: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 61 74 61  _out:.  if( data
c720: 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65  [hdr+7]+cbrk-iCe
c730: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
c740: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
c750: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c760: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
c770: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
c780: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
c790: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
c7a0: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
c7b0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
c7c0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
c7d0: 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  2] = 0;.  memset
c7e0: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
c7f0: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
c800: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
c810: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c820: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c830: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c840: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
c860: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
c870: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
c880: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
c890: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
c8a0: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
c8b0: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
c8c0: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
c8d0: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
c8e0: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
c8f0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
c900: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
c910: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
c920: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
c930: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
c940: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
c950: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c960: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
c970: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
c980: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
c990: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
c9a0: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
c9b0: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
c9c0: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
c9d0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
c9e0: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
c9f0: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
ca00: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
ca10: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
ca20: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
ca30: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
ca40: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
ca50: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
ca60: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
ca70: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
ca80: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ca90: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
caa0: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
cab0: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
cac0: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
cad0: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
cae0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
caf0: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
cb00: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
cb10: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
cb20: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
cb30: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
cb40: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
cb50: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
cb60: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
cb70: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
cb80: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
cb90: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
cba0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
cbb0: 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20 2a   the free slot *
cbc0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e  /..  assert( pc>
cbd0: 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 63  0 );.  while( pc
cbe0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  <=usableSize-4 )
cbf0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
cc00: 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d 35 33  E-OF: R-22710-53
cc10: 33 32 38 20 54 68 65 20 74 68 69 72 64 20 61 6e  328 The third an
cc20: 64 20 66 6f 75 72 74 68 20 62 79 74 65 73 20 6f  d fourth bytes o
cc30: 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 66 72  f each.    ** fr
cc40: 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62  eeblock form a b
cc50: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
cc60: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 73  r which is the s
cc70: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 62  ize of the freeb
cc80: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62  lock.    ** in b
cc90: 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ytes, including 
cca0: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
ccb0: 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d  r. */.    size =
ccc0: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
ccd0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28  [pc+2]);.    if(
cce0: 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79   (x = size - nBy
ccf0: 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  te)>=0 ){.      
cd00: 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34 20 29  testcase( x==4 )
cd10: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
cd20: 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20  ( x==3 );.      
cd30: 69 66 28 20 73 69 7a 65 2b 70 63 20 3e 20 75 73  if( size+pc > us
cd40: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
cd50: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
cd60: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
cd70: 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
cd80: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
cd90: 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20  se if( x<4 ){.  
cda0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
cdb0: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
cdc0: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
cdd0: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
cde0: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
cdf0: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
ce00: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
ce10: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
ce20: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
ce30: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
ce40: 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30  7]>57 ) return 0
ce50: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
ce60: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
ce70: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
ce80: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
ce90: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
cea0: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
ceb0: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
cec0: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
ced0: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
cee0: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
cef0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
cf00: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
cf10: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  )x;.      }else{
cf20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
cf30: 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20  slot remains on 
cf40: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52  the free-list. R
cf50: 65 64 75 63 65 20 69 74 73 20 73 69 7a 65 20 74  educe its size t
cf60: 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20  o account.      
cf70: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f     ** for the po
cf80: 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68  rtion used by th
cf90: 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
cfa0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
cfb0: 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b  2byte(&aData[pc+
cfc0: 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a  2], x);.      }.
cfd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 61 44        return &aD
cfe0: 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20  ata[pc + x];.   
cff0: 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d 20 70   }.    iAddr = p
d000: 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  c;.    pc = get2
d010: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 5d 29  byte(&aData[pc])
d020: 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 41 64  ;.    if( pc<iAd
d030: 64 72 2b 73 69 7a 65 20 29 20 62 72 65 61 6b 3b  dr+size ) break;
d040: 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 20 29 7b  .  }.  if( pc ){
d050: 0a 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49  .    *pRc = SQLI
d060: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
d070: 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  pPg);.  }..  ret
d080: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
d090: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
d0a0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72  ytes of space fr
d0b0: 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d  om within the B-
d0c0: 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64  Tree page passed
d0d0: 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
d0e0: 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65   argument. Write
d0f0: 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20   into *pIdx the 
d100: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
d110: 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20  ->aData[].** of 
d120: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
d130: 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63  f allocated spac
d140: 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  e. Return either
d150: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a   SQLITE_OK or.**
d160: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28   an error code (
d170: 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43  usually SQLITE_C
d180: 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54  ORRUPT)..**.** T
d190: 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e  he caller guaran
d1a0: 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20  tees that there 
d1b0: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  is sufficient sp
d1c0: 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a  ace to make the.
d1d0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ** allocation.  
d1e0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67  This routine mig
d1f0: 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61  ht need to defra
d200: 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  gment in order t
d210: 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74  o bring.** all t
d220: 68 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65  he space togethe
d230: 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69  r, however.  Thi
d240: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61  s routine will a
d250: 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68  void using.** th
d260: 65 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65  e first two byte
d270: 73 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20  s past the cell 
d280: 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e  pointer area sin
d290: 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68  ce presumably th
d2a0: 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  is.** allocation
d2b0: 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69   is being made i
d2c0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72  n order to inser
d2d0: 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f  t a new cell, so
d2e0: 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f   we will.** also
d2f0: 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20   end up needing 
d300: 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74  a new cell point
d310: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
d320: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
d330: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
d340: 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a  int nByte, int *
d350: 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69  pIdx){.  const i
d360: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
d370: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
d380: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
d390: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
d3a0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
d3b0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
d3c0: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
d3d0: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
d3e0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
d3f0: 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
d420: 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  e of cell conten
d430: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
d440: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75   /* Integer retu
d470: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
d480: 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20   gap;        /* 
d490: 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61  First byte of ga
d4a0: 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70  p between cell p
d4b0: 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c  ointers and cell
d4c0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20   content */.  . 
d4d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d4e0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
d4f0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
d500: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d510: 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
d520: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
d530: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
d540: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
d550: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d   assert( nByte>=
d560: 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  0 );  /* Minimum
d570: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
d580: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
d590: 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65  ge->nFree>=nByte
d5a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
d5b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
d5c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
d5d0: 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61  Byte < (int)(pPa
d5e0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d5f0: 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73  ize-8) );..  ass
d600: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c  ert( pPage->cell
d610: 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20  Offset == hdr + 
d620: 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65  12 - 4*pPage->le
d630: 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50  af );.  gap = pP
d640: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
d650: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
d660: 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c  ;.  assert( gap<
d670: 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45  =65536 );.  /* E
d680: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39  VIDENCE-OF: R-29
d690: 33 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65  356-02391 If the
d6a0: 20 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61   database uses a
d6b0: 20 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65   65536-byte page
d6c0: 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74   size.  ** and t
d6d0: 68 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63  he reserved spac
d6e0: 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75  e is zero (the u
d6f0: 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72  sual value for r
d700: 65 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20  eserved space). 
d710: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c   ** then the cel
d720: 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74  l content offset
d730: 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67   of an empty pag
d740: 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35  e wants to be 65
d750: 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65  536..  ** Howeve
d760: 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20  r, that integer 
d770: 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20  is too large to 
d780: 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32  be stored in a 2
d790: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20  -byte unsigned. 
d7a0: 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20   ** integer, so 
d7b0: 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20  a value of 0 is 
d7c0: 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63  used in its plac
d7d0: 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65  e. */.  top = ge
d7e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
d7f0: 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20  +5]);.  assert( 
d800: 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d  top<=(int)pPage-
d810: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
d820: 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62   ); /* Prevent b
d830: 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  y getAndInitPage
d840: 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e  () */.  if( gap>
d850: 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74  top ){.    if( t
d860: 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e  op==0 && pPage->
d870: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d  pBt->usableSize=
d880: 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20  =65536 ){.      
d890: 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20  top = 65536;.   
d8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
d8b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d8c0: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
d8d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
d8e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f   If there is eno
d8f0: 75 67 68 20 73 70 61 63 65 20 62 65 74 77 65 65  ugh space betwee
d900: 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f  n gap and top fo
d910: 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20  r one more cell 
d920: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72  pointer.  ** arr
d930: 61 79 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c  ay entry offset,
d940: 20 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65   and if the free
d950: 6c 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74  list is not empt
d960: 79 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74  y, then search t
d970: 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74  he.  ** freelist
d980: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66   looking for a f
d990: 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f  ree slot big eno
d9a0: 75 67 68 20 74 6f 20 73 61 74 69 73 66 79 20 74  ugh to satisfy t
d9b0: 68 65 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f  he request..  */
d9c0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70  .  testcase( gap
d9d0: 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73  +2==top );.  tes
d9e0: 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f  tcase( gap+1==to
d9f0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
da00: 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69   gap==top );.  i
da10: 66 28 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20  f( (data[hdr+2] 
da20: 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20  || data[hdr+1]) 
da30: 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b  && gap+2<=top ){
da40: 0a 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20  .    u8 *pSpace 
da50: 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
da60: 50 61 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63  Page, nByte, &rc
da70: 29 3b 0a 20 20 20 20 69 66 28 20 70 53 70 61 63  );.    if( pSpac
da80: 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
da90: 74 28 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20  t( pSpace>=data 
daa0: 26 26 20 28 70 53 70 61 63 65 20 2d 20 64 61 74  && (pSpace - dat
dab0: 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20  a)<65536 );.    
dac0: 20 20 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28    *pIdx = (int)(
dad0: 70 53 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a  pSpace - data);.
dae0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
daf0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
db00: 65 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20  e if( rc ){.    
db10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
db20: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
db30: 20 72 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e   request could n
db40: 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20  ot be fulfilled 
db50: 75 73 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74  using a freelist
db60: 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20   slot.  Check.  
db70: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 64 65 66  ** to see if def
db80: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20  ragmentation is 
db90: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
dba0: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b    testcase( gap+
dbb0: 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a  2+nByte==top );.
dbc0: 20 20 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74    if( gap+2+nByt
dbd0: 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73  e>top ){.    ass
dbe0: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
dbf0: 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  l>0 || CORRUPT_D
dc00: 42 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65  B );.    rc = de
dc10: 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61  fragmentPage(pPa
dc20: 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50 61 67 65  ge, MIN(4, pPage
dc30: 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b 6e 42 79  ->nFree - (2+nBy
dc40: 74 65 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  te)));.    if( r
dc50: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
dc60: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
dc70: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
dc80: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73 65  dr+5]);.    asse
dc90: 72 74 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3c  rt( gap+2+nByte<
dca0: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
dcb0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
dcc0: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
dcd0: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
dce0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
dcf0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
dd00: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
dd10: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
dd20: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
dd30: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
dd40: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
dd50: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
dd60: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
dd70: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
dd80: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
dd90: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
dda0: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
ddb0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
ddc0: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
ddd0: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
dde0: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
ddf0: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
de00: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
de10: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
de20: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
de30: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
de40: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
de50: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
de60: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
de70: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
de80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
de90: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
dea0: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
deb0: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
dec0: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
ded0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
dee0: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
def0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
df00: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
df10: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
df20: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
df30: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
df40: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
df50: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
df60: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
df70: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
df80: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
df90: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
dfa0: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
dfb0: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
dfc0: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
dfd0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
dfe0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
dff0: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
e000: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
e010: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
e020: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
e030: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
e040: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
e050: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
e060: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
e070: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
e080: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
e090: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
e0a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
e0b0: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
e0c0: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
e0d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
e0e0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
e0f0: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
e100: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
e110: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
e140: 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74  s of ptr to next
e150: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
e160: 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20  u16 iFreeBlk;   
e170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e180: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e190: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
e1a0: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68  eblock */.  u8 h
e1b0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
e1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1d0: 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72    /* Page header
e1e0: 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30   size.  0 or 100
e1f0: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d   */.  u8 nFrag =
e200: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
e210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
e220: 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67  eduction in frag
e230: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  mentation */.  u
e240: 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69  16 iOrigSize = i
e250: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
e260: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
e270: 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20   value of iSize 
e280: 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20  */.  u16 x;     
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
e2b0: 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
e2c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75  tent area */.  u
e2d0: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
e2e0: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
e2f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
e300: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
e310: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
e320: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
e330: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
e340: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
e350: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
e360: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
e370: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
e380: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
e390: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
e3a0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e3b0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
e3c0: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
e3d0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
e3e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
e3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
e400: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
e410: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
e420: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
e430: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e440: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e450: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e460: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
e470: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
e480: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
e490: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
e4a0: 53 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42  Start<=pPage->pB
e4b0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
e4c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73  );..  /* The lis
e4d0: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
e4e0: 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e  must be in ascen
e4f0: 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e  ding order.  Fin
e500: 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74  d the .  ** spot
e510: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65   on the list whe
e520: 72 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  re iStart should
e530: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
e540: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
e550: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69  ->hdrOffset;.  i
e560: 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  Ptr = hdr + 1;. 
e570: 20 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31   if( data[iPtr+1
e580: 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74  ]==0 && data[iPt
e590: 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72  r]==0 ){.    iFr
e5a0: 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53  eeBlk = 0;  /* S
e5b0: 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20  hortcut for the 
e5c0: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72  case when the fr
e5d0: 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20  eelist is empty 
e5e0: 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
e5f0: 77 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b  while( (iFreeBlk
e600: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
e610: 61 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74  a[iPtr]))<iStart
e620: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
e630: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b  reeBlk<iPtr+4 ){
e640: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
e650: 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b  eeBlk==0 ) break
e660: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
e670: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
e680: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
e690: 20 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20     }.      iPtr 
e6a0: 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20  = iFreeBlk;.    
e6b0: 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  }.    if( iFreeB
e6c0: 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  lk>pPage->pBt->u
e6d0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20  sableSize-4 ){. 
e6e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e6f0: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e700: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
e710: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
e720: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
e730: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
e740: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
e750: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
e760: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
e770: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
e780: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
e790: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
e7a0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
e7b0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
e7c0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
e7d0: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
e7e0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
e7f0: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
e800: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
e810: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
e820: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
e830: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
e840: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
e850: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
e860: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
e870: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
e880: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
e890: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e8a0: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e8b0: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72        iEnd = iFr
e8c0: 65 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65  eeBlk + get2byte
e8d0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b  (&data[iFreeBlk+
e8e0: 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  2]);.      if( i
e8f0: 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  End > pPage->pBt
e900: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
e910: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
e920: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e930: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
e940: 20 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d   }.      iSize =
e950: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
e960: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
e970: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
e980: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
e990: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
e9a0: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
e9b0: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
e9c0: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
e9d0: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
e9e0: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
e9f0: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
ea00: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
ea10: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
ea20: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
ea30: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
ea40: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
ea50: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
ea60: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
ea70: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
ea80: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
ea90: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
eaa0: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
eab0: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
eac0: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
ead0: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
eae0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
eaf0: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
eb00: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
eb10: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
eb20: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
eb30: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
eb40: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
eb50: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
eb60: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
eb70: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
eb80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
eb90: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
eba0: 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
ebb0: 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d  7] -= nFrag;.  }
ebc0: 0a 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28  .  x = get2byte(
ebd0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
ebe0: 20 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29   if( iStart<=x )
ebf0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
ec00: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
ec10: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
ec20: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ec30: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
ec40: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
ec50: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
ec60: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
ec70: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
ec80: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
ec90: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
eca0: 20 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74   iStart<x || iPt
ecb0: 72 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72  r!=hdr+1 ) retur
ecc0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ecd0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ece0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
ecf0: 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c  [hdr+1], iFreeBl
ed00: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
ed10: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69  (&data[hdr+5], i
ed20: 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  End);.  }else{. 
ed30: 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65     /* Insert the
ed40: 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69   new freeblock i
ed50: 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74  nto the freelist
ed60: 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65   */.    put2byte
ed70: 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53  (&data[iPtr], iS
ed80: 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  tart);.  }.  if(
ed90: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73   pPage->pBt->bts
eda0: 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54  Flags & BTS_FAST
edb0: 5f 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f  _SECURE ){.    /
edc0: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
edd0: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
ede0: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
edf0: 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
ee00: 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20  e.    ** option 
ee10: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
ee20: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
ee30: 53 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65  Start], 0, iSize
ee40: 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74  );.  }.  put2byt
ee50: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  e(&data[iStart],
ee60: 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75   iFreeBlk);.  pu
ee70: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
ee80: 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a  art+2], iSize);.
ee90: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
eea0: 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  = iOrigSize;.  r
eeb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
eec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
eed0: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
eee0: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
eef0: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
ef00: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
ef10: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
ef20: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
ef30: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
ef40: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
ef50: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
ef60: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
ef70: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
ef80: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
ef90: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
efa0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
efb0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
efc0: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
efd0: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
efe0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
eff0: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
f000: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
f010: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
f020: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
f030: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f040: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
f050: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
f060: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
f070: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
f080: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
f090: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
f0a0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
f0b0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
f0c0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
f0d0: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
f0e0: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
f0f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f100: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
f110: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
f120: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
f130: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
f140: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
f150: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
f160: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
f170: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
f180: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
f190: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
f1a0: 65 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43  eaf;.  pPage->xC
f1b0: 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69  ellSize = cellSi
f1c0: 7a 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70  zePtr;.  pBt = p
f1d0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28  Page->pBt;.  if(
f1e0: 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f   flagByte==(PTF_
f1f0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
f200: 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a  NTKEY) ){.    /*
f210: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f220: 30 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61  07291-35328 A va
f230: 6c 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20  lue of 5 (0x05) 
f240: 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69  means the page i
f250: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65  s an.    ** inte
f260: 72 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65  rior table b-tre
f270: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
f280: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
f290: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29  DATA|PTF_INTKEY)
f2a0: 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  ==5 );.    /* EV
f2b0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39  IDENCE-OF: R-269
f2c0: 30 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65  00-09176 A value
f2d0: 20 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65   of 13 (0x0d) me
f2e0: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
f2f0: 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61  a.    ** leaf ta
f300: 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ble b-tree page.
f310: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f320: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54  (PTF_LEAFDATA|PT
f330: 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41  F_INTKEY|PTF_LEA
f340: 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50  F)==13 );.    pP
f350: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b  age->intKey = 1;
f360: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
f370: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50  leaf ){.      pP
f380: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
f390: 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 1;.      pPage
f3a0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62  ->xParseCell = b
f3b0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
f3c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
f3d0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f3e0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
f3f0: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f400: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f   = cellSizePtrNo
f410: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70  Payload;.      p
f420: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
f430: 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c   = btreeParseCel
f440: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20  lPtrNoPayload;. 
f450: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
f460: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
f470: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
f480: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
f490: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
f4a0: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
f4b0: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
f4c0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
f4d0: 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33  CE-OF: R-43316-3
f4e0: 37 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20  7308 A value of 
f4f0: 32 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74  2 (0x02) means t
f500: 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20  he page is an.  
f510: 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e    ** interior in
f520: 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e  dex b-tree page.
f530: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f540: 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d  (PTF_ZERODATA)==
f550: 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  2 );.    /* EVID
f560: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35  ENCE-OF: R-59615
f570: 2d 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f  -42828 A value o
f580: 66 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e  f 10 (0x0a) mean
f590: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
f5a0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65      ** leaf inde
f5b0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
f5c0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
f5d0: 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f  TF_ZERODATA|PTF_
f5e0: 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20  LEAF)==10 );.   
f5f0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f600: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   0;.    pPage->i
f610: 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20  ntKeyLeaf = 0;. 
f620: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
f630: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
f640: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
f650: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
f660: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
f670: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
f680: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
f690: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
f6a0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
f6b0: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
f6c0: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
f6d0: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
f6e0: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
f6f0: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
f700: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
f710: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
f720: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
f730: 20 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65   pPage->max1byte
f740: 50 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d  Payload = pBt->m
f750: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a  ax1bytePayload;.
f760: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f770: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
f780: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
f790: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
f7a0: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
f7b0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
f7c0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
f7d0: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
f7e0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
f7f0: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
f800: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
f810: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
f820: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
f830: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
f840: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
f850: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
f860: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
f870: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
f880: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
f890: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
f8a0: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
f8b0: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
f8c0: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
f8d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
f8e0: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
f8f0: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
f900: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
f910: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
f920: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
f930: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
f940: 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20  [] */.  u8 hdr; 
f950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
f960: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
f970: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
f980: 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
f990: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
f9a0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
f9b0: 61 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  a */.  BtShared 
f9c0: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
f9d0: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
f9e0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
f9f0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
fa00: 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73   /* Amount of us
fa10: 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61  able space on ea
fa20: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 31 36  ch page */.  u16
fa30: 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20   cellOffset;    
fa40: 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73  /* Offset from s
fa50: 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20  tart of page to 
fa60: 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
fa70: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65  er */.  int nFre
fa80: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  e;         /* Nu
fa90: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
faa0: 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ytes on the page
fab0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20   */.  int top;  
fac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
fad0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
fae0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
faf0: 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69  */.  int iCellFi
fb00: 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74  rst;    /* First
fb10: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
fb20: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  or freeblock off
fb30: 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  set */.  int iCe
fb40: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
fb50: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
fb60: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
fb70: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ffset */..  asse
fb80: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
fb90: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
fba0: 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30  Page->pBt->db!=0
fbb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fbc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
fbd0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
fbe0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
fbf0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
fc00: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
fc10: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
fc20: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
fc30: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
fc40: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
fc50: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
fc60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fc70: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
fc80: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
fc90: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fca0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
fcb0: 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  age->isInit==0 )
fcc0: 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  ;..  pBt = pPage
fcd0: 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20 3d 20 70  ->pBt;.  hdr = p
fce0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
fcf0: 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
fd00: 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56 49  >aData;.  /* EVI
fd10: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39  DENCE-OF: R-2859
fd20: 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d  4-02890 The one-
fd30: 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66  byte flag at off
fd40: 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67  set 0 indicating
fd50: 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65  .  ** the b-tree
fd60: 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20   page type. */. 
fd70: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
fd80: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
fd90: 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ]) ){.    return
fda0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
fdb0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
fdc0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
fdd0: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
fde0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
fdf0: 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65  65536 );.  pPage
fe00: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31  ->maskPage = (u1
fe10: 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  6)(pBt->pageSize
fe20: 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e   - 1);.  pPage->
fe30: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
fe40: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
fe50: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
fe60: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
fe70: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
fe80: 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67  = hdr + 8 + pPag
fe90: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
fea0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
feb0: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
fec0: 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
fed0: 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
fee0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20  a[cellOffset];. 
fef0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ff00: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
ff10: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
ff20: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
ff30: 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37 35 20  : R-58015-48175 
ff40: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
ff50: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 35  eger at offset 5
ff60: 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20 2a 2a   designates.  **
ff70: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ff80: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ff90: 72 65 61 2e 20 41 20 7a 65 72 6f 20 76 61 6c 75  rea. A zero valu
ffa0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 74 65 67  e for this integ
ffb0: 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e 74 65 72  er is.  ** inter
ffc0: 70 72 65 74 65 64 20 61 73 20 36 35 35 33 36 2e  preted as 65536.
ffd0: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
ffe0: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
fff0: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 2f 2a 20  a[hdr+5]);.  /* 
10000 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
10010 37 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74  7002-32774 The t
10020 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
10030 61 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65  at offset 3 give
10040 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65  s the.  ** numbe
10050 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
10060 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61  e page. */.  pPa
10070 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32  ge->nCell = get2
10080 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
10090 5d 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ]);.  if( pPage-
100a0 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
100b0 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f  Bt) ){.    /* To
100c0 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20   many cells for 
100d0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20  a single page.  
100e0 54 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65  The page must be
100f0 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
10100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
10110 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
10120 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73  );.  }.  testcas
10130 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  e( pPage->nCell=
10140 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 3b  =MX_CELL(pBt) );
10150 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f  .  /* EVIDENCE-O
10160 46 3a 20 52 2d 32 34 30 38 39 2d 35 37 39 37 39  F: R-24089-57979
10170 20 49 66 20 61 20 70 61 67 65 20 63 6f 6e 74 61   If a page conta
10180 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 28 77 68  ins no cells (wh
10190 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20 20 2a 2a  ich is only.  **
101a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20   possible for a 
101b0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 74  root page of a t
101c0 61 62 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69  able that contai
101d0 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e  ns no rows) then
101e0 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66 73 65 74   the.  ** offset
101f0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
10200 74 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65  tent area will e
10210 71 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69  qual the page si
10220 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 2a  ze minus the.  *
10230 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65 72  * bytes of reser
10240 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ved space. */.  
10250 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
10260 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75  Cell>0 || top==u
10270 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52  sableSize || COR
10280 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 2f 2a  RUPT_DB );..  /*
10290 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
102a0 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
102b0 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
102c0 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
102d0 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e   ** of page when
102e0 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e   parsing a cell.
102f0 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65    .  **.  ** The
10300 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
10310 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
10320 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
10330 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
10340 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64   ** past the end
10350 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75 6e 64   of a page bound
10360 61 72 79 20 61 6e 64 20 63 61 75 73 65 73 20 53  ary and causes S
10370 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 74 6f  QLITE_CORRUPT to
10380 20 62 65 20 0a 20 20 2a 2a 20 72 65 74 75 72 6e   be .  ** return
10390 65 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20  ed if it does.. 
103a0 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69 72 73 74   */.  iCellFirst
103b0 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
103c0 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
103d0 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
103e0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
103f0 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  if( pBt->db->fla
10400 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c  gs & SQLITE_Cell
10410 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 69 6e  SizeCk ){.    in
10420 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10430 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
10440 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
10450 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
10460 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz;           /*
10470 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
10480 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  */..    if( !pPa
10490 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c  ge->leaf ) iCell
104a0 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66 6f 72 28  Last--;.    for(
104b0 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
104c0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
104d0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c   pc = get2byteAl
104e0 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c  igned(&data[cell
104f0 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20  Offset+i*2]);.  
10500 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10510 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
10520 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
10530 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
10540 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43  .      if( pc<iC
10550 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69  ellFirst || pc>i
10560 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20  CellLast ){.    
10570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10580 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10590 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
105a0 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d       sz = pPage-
105b0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
105c0 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
105d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
105e0 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
105f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 2b  );.      if( pc+
10600 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
10610 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10630 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10640 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10650 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
10660 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b 0a 20 20   iCellLast++;.  
10670 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74  }  ..  /* Comput
10680 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65  e the total free
10690 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
106a0 67 65 0a 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  ge.  ** EVIDENCE
106b0 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34  -OF: R-23588-344
106c0 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  50 The two-byte 
106d0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
106e0 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20 20  t 1 gives the.  
106f0 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
10700 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
10710 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
10720 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
10730 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65   are no.  ** fre
10740 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63  eblocks. */.  pc
10750 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
10760 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72  a[hdr+1]);.  nFr
10770 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
10780 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74   + top;  /* Init
10790 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72   nFree to non-fr
107a0 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70 61  eeblock free spa
107b0 63 65 20 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30  ce */.  if( pc>0
107c0 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 65 78 74   ){.    u32 next
107d0 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  , size;.    if( 
107e0 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 29 7b  pc<iCellFirst ){
107f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
10800 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35  CE-OF: R-55530-5
10810 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66  2930 In a well-f
10820 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
10830 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20  e, there will.  
10840 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
10850 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
10860 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ll before the fi
10870 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20  rst freeblock.. 
10880 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
10890 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
108a0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
108b0 20 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c   .    }.    whil
108c0 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 66  e( 1 ){.      if
108d0 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29  ( pc>iCellLast )
108e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
108f0 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65  eblock off the e
10900 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nd of the page *
10910 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
10920 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10930 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10940 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20     }.      next 
10950 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
10960 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a  [pc]);.      siz
10970 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
10980 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
10990 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
109a0 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28   size;.      if(
109b0 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33   next<=pc+size+3
109c0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
109d0 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d  pc = next;.    }
109e0 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20  .    if( next>0 
109f0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65  ){.      /* Free
10a00 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63  block not in asc
10a10 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a  ending order */.
10a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10a30 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10a40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
10a50 20 20 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 28     if( pc+size>(
10a60 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 75 73 61  unsigned int)usa
10a70 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
10a80 20 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f   /* Last freeblo
10a90 63 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20  ck extends past 
10aa0 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20  page end */.    
10ab0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ac0 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
10ad0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ge);.    }.  }..
10ae0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
10af0 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61 69  nt, nFree contai
10b00 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  ns the sum of th
10b10 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10b20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
10b30 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
10b40 72 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d  rea plus the num
10b50 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
10b60 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68  s within.  ** th
10b70 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
10b80 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
10b90 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
10ba0 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a   usable-size.  *
10bb0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
10bc0 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
10bd0 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
10be0 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
10bf0 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
10c00 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
10c10 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
10c20 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
10c30 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61  ontent.  ** area
10c40 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
10c50 68 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20  he page header, 
10c60 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  lies within the 
10c70 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
10c80 20 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a   nFree>usableSiz
10c90 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
10ca0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10cb0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
10cc0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
10cd0 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20 69   (u16)(nFree - i
10ce0 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 70 50  CellFirst);.  pP
10cf0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
10d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10d10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
10d20 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
10d30 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
10d40 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
10d50 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
10d60 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
10d70 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
10d80 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
10d90 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
10da0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
10db0 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
10dc0 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
10dd0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
10de0 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
10df0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10e00 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
10e10 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10e20 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
10e30 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10e40 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
10e50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10e60 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
10e70 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
10e80 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
10e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10ea0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10eb0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
10ec0 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
10ed0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
10ee0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
10ef0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
10f00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10f10 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10f20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
10f30 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
10f40 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
10f50 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  RE ){.    memset
10f60 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
10f70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10f80 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
10f90 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
10fa0 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
10fb0 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
10fc0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
10fd0 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
10fe0 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
10ff0 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
11000 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
11010 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
11020 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11030 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
11040 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
11050 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
11060 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
11070 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
11080 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
11090 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
110a0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
110b0 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
110c0 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
110d0 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
110e0 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
110f0 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
11100 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
11110 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
11120 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
11130 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
11140 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
11150 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
11160 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
11170 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
11180 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
11190 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
111a0 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
111b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
111c0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
111d0 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
111e0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
111f0 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
11200 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
11210 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
11220 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
11230 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
11240 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
11250 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
11260 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
11270 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
11280 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
11290 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
112a0 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
112b0 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61  .  if( pgno!=pPa
112c0 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ge->pgno ){.    
112d0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
112e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
112f0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
11300 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
11310 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70  = pDbPage;.    p
11320 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
11330 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  .    pPage->pgno
11340 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61   = pgno;.    pPa
11350 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
11360 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
11370 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
11380 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73   pPage->aData==s
11390 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
113a0 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20  ta(pDbPage) );. 
113b0 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
113c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
113d0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
113e0 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
113f0 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
11400 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
11410 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
11420 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c   needed.  See al
11430 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73  so: btreeGetUnus
11440 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  edPage()..**.** 
11450 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  If the PAGER_GET
11460 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20  _NOCONTENT flag 
11470 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
11480 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
11490 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68  care.** about th
114a0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
114b0 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
114c0 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
114d0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
114e0 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
114f0 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
11500 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
11510 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
11520 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
11530 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
11540 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11550 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
11560 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
11570 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
11580 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
11590 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
115a0 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
115b0 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
115c0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
115d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
115e0 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
115f0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
11600 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
11610 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
11620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
11630 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
11640 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
11650 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
11660 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
11670 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
11680 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
11690 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
116a0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
116b0 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
116c0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
116d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
116e0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
116f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
11700 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
11710 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11720 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
11730 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
11740 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11750 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11760 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11770 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
11780 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
11790 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
117a0 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
117b0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
117c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
117d0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
117e0 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
117f0 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
11800 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11810 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
11820 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
11830 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
11840 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
11850 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
11860 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
11870 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
11880 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
11890 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
118a0 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
118b0 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
118c0 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
118d0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
118e0 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
118f0 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
11900 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
11910 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
11920 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11930 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11940 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
11950 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
11960 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
11970 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
11980 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
11990 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
119a0 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
119b0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
119c0 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
119d0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
119e0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
119f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11a00 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
11a10 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
11a20 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
11a30 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
11a40 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
11a50 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
11a60 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
11a70 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
11a80 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
11a90 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
11aa0 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
11ab0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
11ac0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
11ad0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
11ae0 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
11af0 61 67 65 29 26 30 78 38 30 30 30 30 30 30 30 29  age)&0x80000000)
11b00 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
11b10 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
11b20 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pBt);.}../*.**
11b30 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d   Get a page from
11b40 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69   the pager and i
11b50 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a  nitialize it..**
11b60 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74  .** If pCur!=0 t
11b70 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20  hen the page is 
11b80 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73  being fetched as
11b90 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54   part of a moveT
11ba0 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c  oChild().** call
11bb0 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c  .  Do additional
11bc0 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
11bd0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20   on the page in 
11be0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e  this case..** An
11bf0 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66  d if the fetch f
11c00 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ails, this routi
11c10 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e  ne must decremen
11c20 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a  t pCur->iPage..*
11c30 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73  *.** The page is
11c40 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64   fetched as read
11c50 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43  -write unless pC
11c60 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61  ur is not NULL a
11c70 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d  nd is.** a read-
11c80 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a  only cursor..**.
11c90 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
11ca0 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50  ccurs, then *ppP
11cb0 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  age is undefined
11cc0 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61  . It.** may rema
11cd0 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72  in unchanged, or
11ce0 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74   it may be set t
11cf0 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c  o an invalid val
11d00 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
11d10 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
11d20 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
11d30 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
11d40 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
11d50 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
11d60 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d80 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
11d90 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20  age to get */.  
11da0 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
11db0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11dc0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
11dd0 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
11de0 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
11df0 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ur,             
11e00 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f      /* Cursor to
11e10 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67   receive the pag
11e20 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
11e30 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20  int bReadOnly   
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
11e60 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a  ad-only page */.
11e70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
11e80 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
11e90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11ea0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11eb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
11ec0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
11ed0 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e   ppPage==&pCur->
11ee0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
11ef0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
11f00 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
11f10 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
11f20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
11f30 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
11f40 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
11f50 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
11f60 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
11f70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
11f80 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
11f90 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11fa0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
11fb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
11fc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
11fd0 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
11fe0 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
11ff0 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
12000 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
12010 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
12020 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
12030 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
12040 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
12050 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
12060 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
12070 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
12080 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
12090 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
120a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
120b0 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
120c0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
120d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
120e0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
120f0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
12100 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12110 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
12120 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
12130 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
12140 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
12150 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
12160 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
12170 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
12180 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
12190 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
121a0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
121b0 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
121c0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
121d0 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
121e0 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
121f0 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
12200 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
12210 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
12220 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
12230 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
12240 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12250 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f  ITE_CORRUPT_PGNO
12260 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72 65 6c 65  (pgno);.    rele
12270 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
12280 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
12290 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
122a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
122b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e 64  LITE_OK;..getAnd
122c0 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3a 0a  InitPage_error:.
122d0 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20    if( pCur ){.  
122e0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b    pCur->iPage--;
122f0 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65  .    pCur->pPage
12300 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
12310 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
12320 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  }.  testcase( pg
12330 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
12340 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
12350 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
12360 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
12370 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
12380 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
12390 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
123a0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
123b0 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
123c0 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
123d0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73 20  .**.** Page1 is 
123e0 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 61  a special case a
123f0 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65 61  nd must be relea
12400 73 65 64 20 75 73 69 6e 67 20 72 65 6c 65 61 73  sed using releas
12410 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a 73  ePageOne()..*/.s
12420 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
12430 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
12440 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
12450 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
12460 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12470 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
12480 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12490 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b 0a  ->pDbPage!=0 );.
124a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
124b0 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
124c0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
124d0 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29  = (void*)pPage )
124e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
124f0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
12500 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d  pPage->pDbPage)=
12510 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b  =pPage->aData );
12520 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12530 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12540 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12550 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
12560 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28 70  erUnrefNotNull(p
12570 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
12580 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  }.static void re
12590 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
125a0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
125b0 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73 65   pPage ) release
125c0 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67  PageNotNull(pPag
125d0 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  e);.}.static voi
125e0 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
125f0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
12600 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
12610 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
12620 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
12630 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12640 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
12650 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
12660 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
12670 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
12680 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
12690 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
126a0 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
126b0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
126c0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
126d0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
126e0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
126f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12700 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
12710 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
12720 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
12730 50 61 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e 70  PageOne(pPage->p
12740 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  DbPage);.}../*.*
12750 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20  * Get an unused 
12760 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  page..**.** This
12770 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
12780 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
12790 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
127a0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66  n:.**.**   *  If
127b0 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
127c0 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20  eady in use for 
127d0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
127e0 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  se, immediately.
127f0 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  **      release 
12800 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  it and return an
12810 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20   SQLITE_CURRUPT 
12820 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d  error..**   *  M
12830 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49  ake sure the isI
12840 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nit flag is clea
12850 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
12860 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
12870 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
12880 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
12890 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
128a0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
128b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
128c0 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
128d0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
128e0 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
128f0 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
12900 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
12910 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
12920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
12930 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
12940 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
12950 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
12960 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  nt rc = btreeGet
12970 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
12980 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  ppPage, flags);.
12990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
129a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
129b0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
129c0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
129d0 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
129e0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
129f0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
12a00 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
12a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12a20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
12a40 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
12a50 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
12a60 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
12a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12a80 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
12a90 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
12aa0 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
12ab0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
12ac0 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
12ad0 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
12ae0 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
12af0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
12b00 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
12b10 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
12b20 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
12b30 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
12b40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
12b50 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
12b60 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
12b70 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
12b80 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
12b90 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
12ba0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
12bb0 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
12bc0 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
12bd0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
12be0 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
12bf0 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
12c00 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
12c10 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
12c20 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
12c30 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
12c40 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
12c50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
12c60 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
12c70 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
12c80 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12c90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
12ca0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
12cb0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
12cc0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
12cd0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
12ce0 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
12cf0 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
12d00 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
12d10 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
12d20 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
12d30 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
12d40 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
12d50 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
12d60 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
12d70 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
12d80 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
12d90 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
12da0 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
12db0 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
12dc0 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
12dd0 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
12de0 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
12df0 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
12e00 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
12e10 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
12e20 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
12e30 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
12e40 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
12e50 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
12e60 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
12e70 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
12e80 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
12e90 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
12ea0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
12eb0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12ec0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
12ed0 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
12ee0 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
12ef0 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
12f00 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
12f10 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
12f20 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
12f30 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
12f40 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
12f50 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12f60 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12f70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
12f80 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
12f90 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
12fa0 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
12fb0 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
12fc0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
12fd0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
12fe0 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
12ff0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
13000 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
13010 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
13020 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
13030 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
13040 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
13050 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
13060 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
13070 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
13080 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
13090 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
130a0 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
130b0 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
130c0 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
130d0 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
130e0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
130f0 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
13100 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
13110 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
13120 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
13130 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
13140 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
13150 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
13160 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
13170 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
13180 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
13190 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
131a0 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
131b0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
131c0 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
131d0 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
131e0 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
131f0 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
13200 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
13210 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
13220 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
13230 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
13240 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13250 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
13260 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
13270 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
13280 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
13290 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
132a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
132b0 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
132c0 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
132d0 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
132e0 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
132f0 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
13300 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
13310 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
13320 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
13330 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
13340 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
13350 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
13360 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
13370 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
13380 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
13390 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
133a0 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
133b0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
133c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
133d0 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
133e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
133f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
13400 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
13410 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
13420 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
13430 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
13440 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
13450 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
13460 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13480 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
13490 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
134a0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
134b0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
134c0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
134d0 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
134e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
134f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13500 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
13510 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
13520 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
13530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13540 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
13550 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
13560 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
13570 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
13580 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
13590 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
135a0 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
135b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
135c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
135d0 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
135e0 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
135f0 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
13600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13610 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
13620 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
13630 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
13640 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
13650 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
13660 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
13670 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
13680 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
13690 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
136a0 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
136b0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
136c0 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
136d0 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
136e0 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
136f0 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
13700 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
13710 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
13720 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
13730 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
13740 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
13750 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
13760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
13770 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
13780 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
13790 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
137a0 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
137b0 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
137c0 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
137d0 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
13800 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
13810 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13830 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
13840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
13850 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
13860 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
13870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
13880 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
13890 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
138a0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
138b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
138c0 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
138d0 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
138e0 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
138f0 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
13900 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
13910 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
13920 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
13930 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
13940 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
13950 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
13960 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
13970 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
13980 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
13990 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
139a0 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
139b0 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
139c0 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
139d0 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
139e0 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
139f0 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
13a00 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
13a10 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
13a20 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
13a30 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
13a40 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
13a50 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
13a60 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
13a70 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
13a80 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
13a90 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
13aa0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
13ab0 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
13ac0 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
13ad0 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
13ae0 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
13af0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13b00 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  PT;.  }.  p->inT
13b10 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
13b20 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
13b30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13b40 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13b50 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  E.  p->lock.pBtr
13b60 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63  ee = p;.  p->loc
13b70 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65  k.iTable = 1;.#e
13b80 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
13b90 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
13ba0 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
13bb0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13bc0 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
13bd0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
13be0 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
13bf0 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
13c00 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
13c10 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
13c20 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
13c30 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
13c40 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
13c50 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30   if( isTempDb==0
13c60 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20   && (isMemdb==0 
13c70 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c  || (vfsFlags&SQL
13c80 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30  ITE_OPEN_URI)!=0
13c90 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73  ) ){.    if( vfs
13ca0 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  Flags & SQLITE_O
13cb0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20  PEN_SHAREDCACHE 
13cc0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69  ){.      int nFi
13cd0 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
13ce0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
13cf0 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74  me)+1;.      int
13d00 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
13d10 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
13d20 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
13d30 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
13d40 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d   sqlite3Malloc(M
13d50 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  AX(nFullPathname
13d60 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20  ,nFilename));.  
13d70 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
13d80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
13d90 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a  mutexShared; )..
13da0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
13db0 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  e = 1;.      if(
13dc0 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
13dd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13de0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
13df0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13e00 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13e10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13e20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20  isMemdb ){.     
13e30 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50     memcpy(zFullP
13e40 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61  athname, zFilena
13e50 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a  me, nFilename);.
13e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13e70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13e80 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
13e90 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  pVfs, zFilename,
13ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ec0 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d      nFullPathnam
13ed0 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
13ee0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13ef0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  c ){.          s
13f00 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
13f10 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
13f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
13f30 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
13f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13f50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
13f60 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
13f70 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f  AFE.      mutexO
13f80 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  pen = sqlite3Mut
13f90 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13fa0 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e  UTEX_STATIC_OPEN
13fb0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13fc0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
13fd0 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d  exOpen);.      m
13fe0 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
13ff0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14000 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14010 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
14020 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14030 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
14040 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  d);.#endif.     
14050 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28   for(pBt=GLOBAL(
14060 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14070 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14080 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  ); pBt; pBt=pBt-
14090 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
140a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
140b0 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
140c0 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
140d0 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
140e0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
140f0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
14100 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
14110 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
14120 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67  gerVfs(pBt->pPag
14130 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20  er)==pVfs ){.   
14140 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
14150 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44            for(iD
14160 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62  b=db->nDb-1; iDb
14170 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20  >=0; iDb--){.   
14180 20 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a           Btree *
14190 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e  pExisting = db->
141a0 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20  aDb[iDb].pBt;.  
141b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
141c0 78 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73  xisting && pExis
141d0 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29  ting->pBt==pBt )
141e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
141f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14200 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
14210 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14220 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14230 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
14250 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
14260 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
14270 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14280 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
14290 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
142a0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
142b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
142c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
142d0 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70        p->pBt = p
142e0 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42  Bt;.          pB
142f0 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  t->nRef++;.     
14300 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
14310 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
14320 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14330 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
14340 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  red);.      sqli
14350 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61  te3_free(zFullPa
14360 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23  thname);.    }.#
14370 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
14380 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
14390 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d     /* In debug m
143a0 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c  ode, we mark all
143b0 20 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61   persistent data
143c0 62 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c  bases as sharabl
143d0 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20  e.      ** even 
143e0 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f  when they are no
143f0 74 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73  t.  This exercis
14400 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  es the locking c
14410 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ode and.      **
14420 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f   gives more oppo
14430 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65  rtunity for asse
14440 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  rts(sqlite3_mute
14450 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20  x_held()).      
14460 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  ** statements to
14470 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72   find locking pr
14480 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f  oblems..      */
14490 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
144a0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  le = 1;.    }.#e
144b0 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ndif.  }.#endif.
144c0 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
144d0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
144e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
144f0 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68  rts make sure th
14500 61 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73  at structures us
14510 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
14520 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  are.    ** the r
14530 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73  ight size.  This
14540 20 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61   is to guard aga
14550 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65  inst size change
14560 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20  s that result.  
14570 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c    ** when compil
14580 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65  ing on a differe
14590 6e 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e  nt architecture.
145a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
145b0 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d  rt( sizeof(i64)=
145c0 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
145d0 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38  ( sizeof(u64)==8
145e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
145f0 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
14600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
14610 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
14620 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
14630 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
14640 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
14650 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
14660 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
14670 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
14680 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
14690 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
146a0 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
146b0 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
146c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
146d0 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20  PagerOpen(pVfs, 
146e0 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46  &pBt->pPager, zF
146f0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67     sizeof(MemPag
14720 65 29 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c  e), flags, vfsFl
14730 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29  ags, pageReinit)
14740 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14760 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14770 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
14780 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61  Pager, db->szMma
14790 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  p);.      rc = s
147a0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
147b0 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70  ileheader(pBt->p
147c0 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62  Pager,sizeof(zDb
147d0 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65  Header),zDbHeade
147e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
147f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14800 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  ){.      goto bt
14810 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
14820 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65    }.    pBt->ope
14830 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61  nFlags = (u8)fla
14840 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20  gs;.    pBt->db 
14850 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  = db;.    sqlite
14860 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
14870 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72  dler(pBt->pPager
14880 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  , btreeInvokeBus
14890 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a  yHandler, pBt);.
148a0 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74      p->pBt = pBt
148b0 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43  ;.  .    pBt->pC
148c0 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
148d0 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
148e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
148f0 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70  agerIsreadonly(p
14900 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42  Bt->pPager) ) pB
14910 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
14920 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69  TS_READ_ONLY;.#i
14930 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14940 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 0a  _SECURE_DELETE).
14950 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
14960 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
14970 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20 64 65  DELETE;.#elif de
14980 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 46 41 53  fined(SQLITE_FAS
14990 54 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  T_SECURE_DELETE)
149a0 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
149b0 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52 57 52  gs |= BTS_OVERWR
149c0 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ITE;.#endif.    
149d0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
149e0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
149f0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
14a00 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
14a10 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
14a20 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
14a30 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
14a40 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
14a50 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
14a60 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
14a70 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
14a80 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
14a90 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
14aa0 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
14ab0 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
14ac0 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
14ad0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
14ae0 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
14af0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
14b00 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
14b10 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
14b20 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
14b30 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
14b40 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
14b50 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
14b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
14b70 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
14b80 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
14b90 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
14ba0 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
14bb0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
14bc0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
14bd0 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
14be0 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
14bf0 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
14c00 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
14c10 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
14c20 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
14c30 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
14c40 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
14c50 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
14c60 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
14c70 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
14c80 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
14c90 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
14ca0 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
14cb0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
14cc0 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
14cd0 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
14ce0 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
14cf0 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
14d00 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
14d10 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
14d20 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
14d30 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14d40 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
14d50 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
14d60 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
14d70 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
14d80 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
14d90 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
14da0 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
14db0 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
14dc0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  se{.      /* EVI
14dd0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
14de0 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
14df0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
14e00 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20   region is.     
14e10 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
14e20 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
14e30 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
14e40 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
14e50 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a  et of 20.      *
14e60 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
14e70 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
14e80 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72   */.      nReser
14e90 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
14ea0 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
14eb0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
14ec0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
14ed0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14ee0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
14ef0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
14f00 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
14f10 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
14f20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
14f30 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
14f40 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
14f50 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
14f60 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
14f70 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
14f80 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
14f90 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
14fa0 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
14fb0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
14fc0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
14fd0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
14fe0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
14ff0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
15000 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
15010 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
15020 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
15030 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
15040 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
15050 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
15060 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
15070 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
15080 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
15090 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
150a0 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
150b0 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
150c0 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
150d0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
150e0 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
150f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
15100 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69  >nRef = 1;.    i
15110 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
15120 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  {.      MUTEX_LO
15130 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
15140 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
15150 20 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c   ).      MUTEX_L
15160 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65  OGIC( mutexShare
15170 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
15180 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
15190 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
151a0 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51  );).      if( SQ
151b0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
151c0 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
151d0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
151e0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
151f0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
15200 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15210 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
15220 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
15230 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
15240 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
15250 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
15260 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
15270 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
15280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15290 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
152a0 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
152b0 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
152c0 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
152d0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
152e0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
152f0 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
15300 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
15310 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
15320 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
15330 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15340 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
15350 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
15360 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
15370 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
15380 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
15390 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
153a0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
153b0 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
153c0 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
153d0 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
153e0 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
153f0 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
15400 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
15410 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
15420 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
15430 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
15440 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
15450 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
15460 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
15470 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
15480 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
15490 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
154a0 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
154b0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
154c0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
154d0 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
154e0 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
154f0 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
15500 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
15510 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
15520 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
15530 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
15540 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74  uptr)p->pBt<(upt
15550 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  r)pSib->pBt ){. 
15560 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
15570 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
15580 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
15590 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
155a0 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
155b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
155c0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
155d0 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74  b->pNext && (upt
155e0 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  r)pSib->pNext->p
155f0 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20  Bt<(uptr)p->pBt 
15600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
15610 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
15620 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
15630 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
15640 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
15650 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
15660 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
15670 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
15680 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
15690 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
156a0 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
156b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
156c0 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
156d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
156e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
156f0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
15700 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
15710 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
15720 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15730 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
15740 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
15750 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
15760 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
15770 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  t->pPager, 0);. 
15780 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
15790 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
157a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
157b0 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
157c0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
157d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
157e0 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ile;..    /* If 
157f0 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
15800 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
15810 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
15820 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
15830 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
15840 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
15850 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
15860 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
15870 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
15880 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
15890 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
158a0 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
158b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
158c0 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
158d0 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
158e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
158f0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
15900 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
15910 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
15920 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a  E_SIZE);.    }..
15930 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69      pFile = sqli
15940 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
15950 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
15960 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
15970 64 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ds ){.      sqli
15980 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
15990 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
159a0 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76  TE_FCNTL_PDB, (v
159b0 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a  oid*)&pBt->db);.
159c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
159d0 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
159e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
159f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
15a00 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
15a10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15a20 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
15a30 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
15a40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
15a50 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74  ite3BtreeConnect
15a60 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65  ionCount(*ppBtre
15a70 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  e)>0 );.  return
15a80 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
15a90 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
15aa0 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
15ab0 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
15ac0 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
15ad0 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
15ae0 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
15af0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
15b00 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
15b10 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
15b20 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
15b30 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
15b40 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
15b50 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
15b60 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
15b70 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
15b80 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
15b90 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
15ba0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15bb0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
15bc0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
15bd0 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
15be0 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
15bf0 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
15c00 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
15c10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15c20 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
15c30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
15c40 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
15c50 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
15c60 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
15c70 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
15c80 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
15c90 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
15ca0 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
15cb0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
15cc0 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
15cd0 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
15ce0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15cf0 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
15d00 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
15d10 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
15d20 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
15d30 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
15d40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15d50 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
15d60 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
15d70 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
15d80 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
15d90 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
15da0 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
15db0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
15dc0 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
15dd0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
15de0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
15df0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
15e00 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
15e10 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
15e20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
15e30 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
15e40 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
15e50 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
15e60 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
15e70 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
15e80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
15e90 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
15ea0 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
15eb0 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
15ec0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
15ed0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
15ee0 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
15ef0 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
15f00 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
15f10 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
15f20 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61  Bt) bytes with a
15f30 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66   4-byte prefix f
15f40 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a  or a left-child.
15f50 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ** pointer..*/.s
15f60 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
15f70 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
15f80 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
15f90 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
15fa0 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
15fb0 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
15fc0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
15fd0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
15fe0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
15ff0 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
16000 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
16010 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
16020 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
16030 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
16040 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
16050 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
16060 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
16070 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
16080 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
16090 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
160a0 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
160b0 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
160c0 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
160d0 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
160e0 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
160f0 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
16100 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
16110 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
16120 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
16130 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
16140 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
16150 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
16160 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
16170 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
16180 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
16190 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
161a0 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
161b0 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
161c0 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
161d0 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
161e0 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
161f0 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
16200 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
16210 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
16220 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
16230 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
16240 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
16250 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
16260 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
16270 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
16280 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
16290 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20   Also:  Provide 
162a0 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e  four bytes of in
162b0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
162c0 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
162d0 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  * beginning of p
162e0 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61  TmpSpace as an a
162f0 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  rea available to
16300 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20   prepend the.   
16310 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70   ** left-child p
16320 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65  ointer to the be
16330 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c  ginning of a cel
16340 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
16350 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
16360 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
16370 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
16380 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42   0, 8);.      pB
16390 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20  t->pTmpSpace += 
163a0 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
163b0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
163c0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
163d0 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
163e0 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
163f0 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
16400 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  pBt){.  if( pBt-
16410 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
16420 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16430 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74   -= 4;.    sqlit
16440 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e  e3PageFree(pBt->
16450 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
16460 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
16470 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
16480 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
16490 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
164a0 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
164b0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
164c0 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
164d0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
164e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
164f0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
16500 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
16510 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
16520 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
16530 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
16540 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16550 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
16560 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
16570 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
16580 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
16590 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
165a0 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
165b0 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
165c0 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
165d0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
165e0 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
165f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
16600 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
16610 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
16620 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
16630 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
16640 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
16650 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
16660 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
16670 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
16680 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
16690 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
166a0 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
166b0 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
166c0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
166d0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
166e0 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
166f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16700 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
16710 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
16720 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
16730 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
16740 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
16750 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
16760 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
16770 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
16780 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
16790 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
167a0 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
167b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
167c0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
167d0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
167e0 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
167f0 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
16800 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
16810 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
16820 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
16830 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
16840 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
16850 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
16860 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
16870 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
16880 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
16890 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
168a0 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
168b0 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
168c0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
168d0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
168e0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
168f0 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
16900 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  , p->db);.    if
16910 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
16920 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
16930 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
16940 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
16950 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
16960 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
16970 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
16980 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
16990 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
169a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
169b0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
169c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
169d0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
169e0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
169f0 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
16a00 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
16a10 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
16a20 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
16a30 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
16a40 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
16a50 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
16a60 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
16a70 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
16a80 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
16a90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16aa0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16ab0 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20  "soft" limit on 
16ac0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16ad0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
16ae0 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20  ..** Unused and 
16af0 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73  unmodified pages
16b00 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65   will be recycle
16b10 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
16b20 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e  r of.** pages in
16b30 20 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65   the cache excee
16b40 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d  ds this soft lim
16b50 69 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a  it.  But the siz
16b60 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68  e of the.** cach
16b70 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
16b80 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e  grow larger than
16b90 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69   this limit if i
16ba0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69  t contains.** di
16bb0 72 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67  rty pages or pag
16bc0 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69  es still in acti
16bd0 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ve use..*/.int s
16be0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
16bf0 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
16c00 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
16c10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
16c20 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
16c30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16c40 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
16c50 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16c60 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
16c70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16c80 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
16c90 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
16ca0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16cb0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16cd0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
16ce0 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e  "spill" limit on
16cf0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16d00 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
16d10 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  e..** If the num
16d20 62 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63  ber of pages exc
16d30 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20  eeds this limit 
16d40 64 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74  during a write t
16d50 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74  ransaction,.** t
16d60 68 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61  he pager might a
16d70 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c  ttempt to "spill
16d80 22 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a  " pages to the j
16d90 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a  ournal early in.
16da0 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  ** order to free
16db0 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a   up memory..**.*
16dc0 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
16dd0 72 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72  rned is the curr
16de0 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20  ent spill size. 
16df0 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73   If zero is pass
16e00 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75  ed.** as an argu
16e10 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73  ment, no changes
16e20 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
16e30 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74   spill size sett
16e40 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67  ing, so.** using
16e50 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20   mxPage of 0 is 
16e60 61 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74  a way to query t
16e70 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
16e80 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   size..*/.int sq
16e90 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
16ea0 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  llSize(Btree *p,
16eb0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
16ec0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
16ed0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65  p->pBt;.  int re
16ee0 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  s;.  assert( sql
16ef0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16f00 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
16f10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16f20 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d  nter(p);.  res =
16f30 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16f40 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70  Spillsize(pBt->p
16f50 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
16f60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
16f70 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
16f80 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   res;.}..#if SQL
16f90 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
16fa0 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  E>0./*.** Change
16fb0 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
16fc0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
16fd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
16fe0 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d  at may be.** mem
16ff0 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69  ory mapped..*/.i
17000 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
17010 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65  etMmapLimit(Btre
17020 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
17030 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42  t64 szMmap){.  B
17040 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17050 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
17060 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
17070 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
17080 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
17090 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
170a0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
170b0 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
170c0 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20  ger, szMmap);.  
170d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
170e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
170f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17100 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
17110 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
17120 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17130 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
17140 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
17150 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
17160 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
17170 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
17180 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
17190 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
171a0 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
171b0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
171c0 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
171d0 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
171e0 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
171f0 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
17200 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
17210 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
17220 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
17230 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
17240 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
17250 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
17260 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
17270 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
17280 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
17290 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
172a0 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
172b0 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
172c0 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
172d0 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
172e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
172f0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
17300 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17310 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a  eSetPagerFlags(.
17320 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
17330 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17340 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65  btree to set the
17350 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e   safety level on
17360 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
17370 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20  gFlags       /* 
17380 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20  Various PAGER_* 
17390 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74  flags */.){.  Bt
173a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
173b0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
173c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
173d0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
173e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
173f0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
17400 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
17410 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  gs(pBt->pPager, 
17420 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  pgFlags);.  sqli
17430 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17440 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17450 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
17460 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17470 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
17480 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
17490 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
174a0 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
174b0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
174c0 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
174d0 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
174e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
174f0 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
17500 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
17510 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
17520 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
17530 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
17540 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
17550 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
17560 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
17570 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
17580 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
17590 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
175a0 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
175b0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
175c0 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
175d0 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
175e0 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
175f0 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
17600 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
17610 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
17620 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
17630 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
17640 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
17650 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
17660 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
17670 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
17680 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
17690 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
176a0 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
176b0 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
176c0 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
176d0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
176e0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
176f0 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
17700 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
17710 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
17720 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
17730 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
17740 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
17750 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
17760 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
17770 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
17780 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
17790 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
177a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
177b0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
177c0 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
177d0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
177e0 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
177f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17800 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
17810 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
17820 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
17830 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
17840 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
17850 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
17860 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
17870 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
17880 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
17890 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
178a0 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
178b0 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
178c0 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
178d0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
178e0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
178f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17900 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
17910 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
17920 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
17930 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
17940 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
17950 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
17960 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
17970 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
17980 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
17990 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
179a0 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
179b0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
179c0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
179d0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
179e0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
179f0 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
17a00 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
17a10 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
17a20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
17a30 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
17a40 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
17a50 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
17a60 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
17a70 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
17a80 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
17a90 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
17aa0 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
17ab0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
17ac0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17ad0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
17ae0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
17af0 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
17b00 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
17b10 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
17b20 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
17b30 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17b40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17b50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
17b60 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
17b70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
17b80 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
17b90 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
17ba0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
17bb0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
17bc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17bd0 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
17be0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
17bf0 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
17c00 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
17c10 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
17c20 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
17c30 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
17c40 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
17c50 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
17c60 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
17c70 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
17c80 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
17c90 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
17ca0 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
17cb0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
17cc0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
17cd0 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
17ce0 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
17cf0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
17d00 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
17d10 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
17d20 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
17d30 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
17d40 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
17d50 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
17d60 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
17d70 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
17d80 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
17d90 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
17da0 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
17db0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
17dc0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17dd0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
17de0 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
17df0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
17e00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17e10 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
17e20 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
17e30 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
17e40 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
17e50 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
17e60 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
17e70 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
17e80 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
17e90 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
17ea0 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
17eb0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
17ec0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
17ed0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
17ee0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
17ef0 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
17f00 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
17f10 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
17f20 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
17f30 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
17f40 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
17f50 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
17f60 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
17f70 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
17f80 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
17f90 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
17fa0 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
17fb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17fc0 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
17fd0 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
17fe0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
17ff0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
18000 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
18010 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
18020 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
18030 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
18040 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
18050 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
18060 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
18070 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
18080 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
18090 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
180a0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
180b0 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
180c0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
180d0 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
180e0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
180f0 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
18100 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
18110 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
18120 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
18130 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
18140 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
18150 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
18160 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
18170 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
18180 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
18190 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
181a0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
181b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
181c0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
181d0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
181e0 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
181f0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
18200 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18210 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
18220 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
18230 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  he values for th
18240 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
18250 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52  ETE and BTS_OVER
18260 57 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a  WRITE flags:.**.
18270 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 30  **    newFlag==0
18280 20 20 20 20 20 20 20 42 6f 74 68 20 42 54 53 5f         Both BTS_
18290 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e  SECURE_DELETE an
182a0 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20  d BTS_OVERWRITE 
182b0 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20  are cleared.**  
182c0 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20 20 20    newFlag==1    
182d0 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45     BTS_SECURE_DE
182e0 4c 45 54 45 20 73 65 74 20 61 6e 64 20 42 54 53  LETE set and BTS
182f0 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 63 6c  _OVERWRITE is cl
18300 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46  eared.**    newF
18310 6c 61 67 3d 3d 32 20 20 20 20 20 20 20 42 54 53  lag==2       BTS
18320 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63  _SECURE_DELETE c
18330 6c 65 61 72 65 64 20 61 6e 64 20 42 54 53 5f 4f  leared and BTS_O
18340 56 45 52 57 52 49 54 45 20 69 73 20 73 65 74 0a  VERWRITE is set.
18350 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 28  **    newFlag==(
18360 2d 31 29 20 20 20 20 4e 6f 20 63 68 61 6e 67 65  -1)    No change
18370 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  s.**.** This rou
18380 74 69 6e 65 20 61 63 74 73 20 61 73 20 61 20 71  tine acts as a q
18390 75 65 72 79 20 69 66 20 6e 65 77 46 6c 61 67 20  uery if newFlag 
183a0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
183b0 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53  o.**.** With BTS
183c0 5f 4f 56 45 52 57 52 49 54 45 20 73 65 74 2c 20  _OVERWRITE set, 
183d0 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20  deleted content 
183e0 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 62  is overwritten b
183f0 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a 2a 20  y zeros, but.** 
18400 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
18410 67 65 73 20 61 72 65 20 6e 6f 74 20 77 72 69 74  ges are not writ
18420 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
18430 64 61 74 61 62 61 73 65 2e 20 20 54 68 75 73 20  database.  Thus 
18440 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c 65 74  in-page.** delet
18450 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 63 6c  ed content is cl
18460 65 61 72 65 64 2c 20 62 75 74 20 66 72 65 65 6c  eared, but freel
18470 69 73 74 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  ist deleted cont
18480 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a  ent is not..**.*
18490 2a 20 57 69 74 68 20 42 54 53 5f 53 45 43 55 52  * With BTS_SECUR
184a0 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72 61 74  E_DELETE, operat
184b0 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54 53 5f  ion is like BTS_
184c0 4f 56 45 52 57 52 49 54 45 20 77 69 74 68 20 74  OVERWRITE with t
184d0 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a 20 74  he addition.** t
184e0 68 61 74 20 66 72 65 65 6c 69 73 74 20 6c 65 61  hat freelist lea
184f0 66 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  f pages are writ
18500 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
18510 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e 63 72  e database, incr
18520 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20 61 6d  easing.** the am
18530 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20 49 2f 4f  ount of disk I/O
18540 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18550 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
18560 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
18570 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
18580 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
18590 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
185a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
185b0 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f  ;.  assert( BTS_
185c0 4f 56 45 52 57 52 49 54 45 3d 3d 42 54 53 5f 53  OVERWRITE==BTS_S
185d0 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 32 20 29  ECURE_DELETE*2 )
185e0 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54 53 5f  ;.  assert( BTS_
185f0 46 41 53 54 5f 53 45 43 55 52 45 3d 3d 28 42 54  FAST_SECURE==(BT
18600 53 5f 4f 56 45 52 57 52 49 54 45 7c 42 54 53 5f  S_OVERWRITE|BTS_
18610 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 20 29  SECURE_DELETE) )
18620 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
18630 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
18640 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
18650 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3b 0a  TS_FAST_SECURE;.
18660 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46      p->pBt->btsF
18670 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
18680 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46 6c 61  RE_DELETE*newFla
18690 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28 70 2d  g;.  }.  b = (p-
186a0 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
186b0 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45   BTS_FAST_SECURE
186c0 29 2f 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  )/BTS_SECURE_DEL
186d0 45 54 45 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ETE;.  sqlite3Bt
186e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
186f0 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn b;.}../*.*
18700 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
18710 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
18720 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
18730 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
18740 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
18750 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
18760 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
18770 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
18780 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
18790 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
187a0 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
187b0 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
187c0 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
187d0 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
187e0 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
187f0 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
18800 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
18810 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
18820 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
18830 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
18840 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
18850 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
18860 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
18870 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
18880 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
18890 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
188a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
188b0 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
188c0 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
188d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
188e0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28 70 42  er(p);.  if( (pB
188f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
18900 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
18910 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31 3a 30  )!=0 && (av ?1:0
18920 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  )!=pBt->autoVacu
18930 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
18940 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
18950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
18960 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
18970 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d  v ?1:0;.    pBt-
18980 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61 76  >incrVacuum = av
18990 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20  ==2 ?1:0;.  }.  
189a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
189b0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
189c0 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  c;.#endif.}../*.
189d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
189e0 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f  lue of the 'auto
189f0 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
18a00 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75  y. If auto-vacuu
18a10 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64  m is .** enabled
18a20 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   1 is returned. 
18a30 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a  Otherwise 0..*/.
18a40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18a50 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  GetAutoVacuum(Bt
18a60 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20  ree *p){.#ifdef 
18a70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
18a80 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
18a90 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
18aa0 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69  _NONE;.#else.  i
18ab0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
18ac0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18ad0 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d   rc = (.    (!p-
18ae0 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  >pBt->autoVacuum
18af0 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  )?BTREE_AUTOVACU
18b00 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70  UM_NONE:.    (!p
18b10 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ->pBt->incrVacuu
18b20 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
18b30 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54  UUM_FULL:.    BT
18b40 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49  REE_AUTOVACUUM_I
18b50 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74  NCR.  );.  sqlit
18b60 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
18b70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
18b80 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  ndif.}../*.** If
18b90 20 74 68 65 20 75 73 65 72 20 68 61 73 20 6e 6f   the user has no
18ba0 74 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  t set the safety
18bb0 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68 69 73 20  -level for this 
18bc0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
18bd0 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22 50 52  ion.** using "PR
18be0 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
18bf0 22 2c 20 61 6e 64 20 69 66 20 74 68 65 20 73 61  ", and if the sa
18c00 66 65 74 79 2d 6c 65 76 65 6c 20 69 73 20 6e 6f  fety-level is no
18c10 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74  t already.** set
18c20 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
18c30 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
18c40 63 74 69 6f 6e 20 61 73 20 74 68 65 20 73 65 63  ction as the sec
18c50 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c 0a 2a  ond parameter,.*
18c60 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a  * set it so..*/.
18c70 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  #if SQLITE_DEFAU
18c80 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 21 3d  LT_SYNCHRONOUS!=
18c90 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
18ca0 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 20 5c  AL_SYNCHRONOUS \
18cb0 0a 20 20 20 20 26 26 20 21 64 65 66 69 6e 65 64  .    && !defined
18cc0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
18cd0 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  ).static void se
18ce0 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67  tDefaultSyncFlag
18cf0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
18d00 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  u8 safety_level)
18d10 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
18d20 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 69 66  .  Db *pDb;.  if
18d30 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21 3d  ( (db=pBt->db)!=
18d40 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61 44  0 && (pDb=db->aD
18d50 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  b)!=0 ){.    whi
18d60 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  le( pDb->pBt==0 
18d70 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74  || pDb->pBt->pBt
18d80 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20  !=pBt ){ pDb++; 
18d90 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 62  }.    if( pDb->b
18da0 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20 20 20  SyncSet==0 .    
18db0 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74 79 5f   && pDb->safety_
18dc0 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f 6c 65  level!=safety_le
18dd0 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70 44 62  vel .     && pDb
18de0 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20 0a 20  !=&db->aDb[1] . 
18df0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44 62 2d     ){.      pDb-
18e00 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  >safety_level = 
18e10 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a 20 20  safety_level;.  
18e20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18e30 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50  SetFlags(pBt->pP
18e40 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ager,.          
18e50 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
18e60 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  l | (db->flags &
18e70 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d 41 53   PAGER_FLAGS_MAS
18e80 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  K));.    }.  }.}
18e90 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
18ea0 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
18eb0 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f 6c 65  ag(pBt,safety_le
18ec0 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  vel).#endif../*.
18ed0 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
18ee0 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
18ef0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18f00 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
18f10 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
18f20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
18f30 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
18f40 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
18f50 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
18f60 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
18f70 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
18f80 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
18f90 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
18fa0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
18fb0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
18fc0 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
18fd0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
18fe0 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
18ff0 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
19000 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
19010 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
19020 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
19030 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
19040 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
19050 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
19060 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
19070 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
19080 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
19090 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
190a0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
190b0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
190c0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
190d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
190e0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
190f0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
19100 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
19110 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
19120 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
19130 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
19140 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
19150 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19160 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
19170 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
19180 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
19190 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
191a0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
191b0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
191c0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
191d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
191e0 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
191f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
19200 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19210 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
19220 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
19230 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
19240 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
19250 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
19260 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
19270 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
19280 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
19290 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
192a0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
192b0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
192c0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
192d0 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
192e0 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
192f0 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
19300 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
19310 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
19320 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
19330 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
19340 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
19350 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
19360 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
19370 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
19380 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
19390 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
193a0 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
193b0 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
193c0 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
193d0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
193e0 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
193f0 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
19400 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
19410 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19420 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
19430 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
19440 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
19450 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
19460 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
19470 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
19480 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
19490 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
194a0 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
194b0 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
194c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
194d0 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
194e0 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
194f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
19500 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19510 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
19520 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
19530 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
19540 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
19550 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
19560 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
19570 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
19580 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
19590 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
195a0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
195b0 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
195c0 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
195d0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
195e0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
195f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
19600 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
19610 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19620 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19630 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
19640 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
19650 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
19660 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
19670 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
19680 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
19690 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
196a0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
196b0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
196c0 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
196d0 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
196e0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
196f0 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
19700 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
19710 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
19720 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
19730 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
19740 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
19750 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
19760 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
19770 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
19780 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
19790 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
197a0 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
197b0 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
197c0 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
197d0 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
197e0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
197f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
19800 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
19810 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
19820 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
19830 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
19840 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
19850 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
19860 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
19870 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
19880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
198a0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
198b0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
198c0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 74 44  se{.        setD
198d0 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
198e0 42 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  Bt, SQLITE_DEFAU
198f0 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
19900 55 53 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69  US+1);.        i
19910 66 28 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a  f( isOpen==0 ){.
19920 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
19930 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
19940 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
19950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19970 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
19980 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65  E_NOTADB;.    }e
19990 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65  lse{.      setDe
199a0 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42  faultSyncFlag(pB
199b0 74 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  t, SQLITE_DEFAUL
199c0 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29  T_SYNCHRONOUS+1)
199d0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
199e0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
199f0 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31  OF: R-15465-2081
19a00 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e  3 The maximum an
19a10 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64  d minimum embedd
19a20 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a  ed payload.    *
19a30 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20  * fractions and 
19a40 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64  the leaf payload
19a50 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73   fraction values
19a60 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c   must be 64, 32,
19a70 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a   and 32..    **.
19a80 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69      ** The origi
19a90 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77  nal design allow
19aa0 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73  ed these amounts
19ab0 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73   to vary, but as
19ac0 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69   of.    ** versi
19ad0 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71  on 3.6.0, we req
19ae0 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20  uire them to be 
19af0 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  fixed..    */.  
19b00 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61    if( memcmp(&pa
19b10 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30  ge1[21], "\100\0
19b20 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b  40\040",3)!=0 ){
19b30 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
19b40 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19b50 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
19b60 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
19b70 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
19b80 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
19b90 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
19ba0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
19bb0 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
19bc0 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
19bd0 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
19be0 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
19bf0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
19c00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19c10 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65  ile. */.    page
19c20 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36  Size = (page1[16
19c30 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31  ]<<8) | (page1[1
19c40 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20  7]<<16);.    /* 
19c50 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19c60 35 30 30 38 2d 32 31 36 38 38 20 54 68 65 20 73  5008-21688 The s
19c70 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 69 73  ize of a page is
19c80 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a   a power of two.
19c90 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35      ** between 5
19ca0 31 32 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63  12 and 65536 inc
19cb0 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69  lusive. */.    i
19cc0 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
19cd0 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20  &pageSize)!=0.  
19ce0 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53     || pageSize>S
19cf0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
19d00 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67  IZE .     || pag
19d10 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20  eSize<=256 .    
19d20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
19d30 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19d40 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
19d50 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
19d60 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==0 );.    /* E
19d70 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
19d80 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22 72  310-51205 The "r
19d90 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20 73  eserved space" s
19da0 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74  ize in the 1-byt
19db0 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72  e.    ** integer
19dc0 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69 73   at offset 20 is
19dd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19de0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 74  ytes of space at
19df0 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20   the end of.    
19e00 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f 20  ** each page to 
19e10 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74 65  reserve for exte
19e20 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a  nsions. .    **.
19e30 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
19e40 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
19e50 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
19e60 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
19e70 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  n is.    ** dete
19e80 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e  rmined by the on
19e90 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20  e-byte unsigned 
19ea0 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74  integer found at
19eb0 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30   an offset of 20
19ec0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
19ed0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
19ee0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73  eader. */.    us
19ef0 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53  ableSize = pageS
19f00 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b  ize - page1[20];
19f10 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70 61  .    if( (u32)pa
19f20 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67  geSize!=pBt->pag
19f30 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f  eSize ){.      /
19f40 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20  * After reading 
19f50 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19f60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  f the database a
19f70 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73  ssuming a page s
19f80 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ize.      ** of 
19f90 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a  BtShared.pageSiz
19fa0 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f  e, we have disco
19fb0 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70  vered that the p
19fc0 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20  age-size is.    
19fd0 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61    ** actually pa
19fe0 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74  geSize. Unlock t
19ff0 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61  he database, lea
1a000 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61  ve pBt->pPage1 a
1a010 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20  t.      ** zero 
1a020 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
1a030 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72  E_OK. The caller
1a040 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20   will call this 
1a050 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
1a060 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65  * again with the
1a070 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69   correct page-si
1a080 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ze..      */.   
1a090 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e     releasePageOn
1a0a0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
1a0b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a0c0 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
1a0d0 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
1a0e0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1a0f0 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
1a100 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
1a110 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a120 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
1a130 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
1a140 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
1a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a160 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1a170 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
1a180 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a190 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
1a1a0 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
1a1b0 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
1a1c0 63 68 65 6d 61 29 3d 3d 30 20 26 26 20 6e 50 61  chema)==0 && nPa
1a1d0 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
1a1e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a1f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1a200 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1a210 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1a220 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
1a230 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
1a240 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
1a250 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
1a260 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
1a270 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
1a280 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
1a290 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
1a2a0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
1a2b0 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
1a2c0 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
1a2d0 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
1a2e0 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
1a2f0 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
1a300 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
1a310 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1a320 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
1a330 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
1a340 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
1a350 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
1a360 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
1a370 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a380 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
1a390 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
1a3a0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
1a3b0 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
1a3c0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
1a3d0 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
1a3e0 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
1a3f0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
1a400 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
1a410 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
1a420 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
1a430 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
1a440 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
1a450 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
1a460 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
1a470 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
1a480 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
1a490 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
1a4a0 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
1a4b0 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
1a4c0 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
1a4d0 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
1a4e0 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
1a4f0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
1a500 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
1a510 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
1a520 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
1a530 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
1a540 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
1a550 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
1a560 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
1a570 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
1a580 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
1a590 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
1a5a0 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
1a5b0 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
1a5c0 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
1a5d0 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
1a5e0 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
1a5f0 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
1a600 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
1a610 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
1a620 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
1a630 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
1a640 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
1a650 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
1a660 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
1a670 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1a680 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
1a690 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
1a6a0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
1a6b0 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
1a6c0 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
1a6d0 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
1a6e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1a6f0 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
1a700 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
1a710 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1a720 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
1a730 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
1a740 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
1a750 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
1a760 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
1a770 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
1a780 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1a790 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
1a7a0 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
1a7b0 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
1a7c0 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
1a7d0 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
1a7e0 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
1a7f0 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
1a800 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1a810 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
1a820 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
1a830 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e  .  releasePageOn
1a840 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
1a850 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1a860 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1a870 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1a880 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1a890 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
1a8a0 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69  open on pBt. Thi
1a8b0 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
1a8c0 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
1a8d0 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
1a8e0 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
1a8f0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
1a900 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
1a910 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
1a920 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1a930 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74  d if wrOnly is t
1a940 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20  rue.  If wrOnly 
1a950 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e  is.** false then
1a960 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
1a970 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   counted..**.** 
1a980 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
1a990 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
1a9a0 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e  , a cursor is an
1a9b0 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
1a9c0 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72   is capable of r
1a9d0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1a9e0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1a9f0 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74  e.  Cursors that
1aa00 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72  .** have been tr
1aa10 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43  ipped into the C
1aa20 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74  URSOR_FAULT stat
1aa30 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65  e are not counte
1aa40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1aa50 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1aa60 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
1aa70 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20  , int wrOnly){. 
1aa80 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
1aa90 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
1aaa0 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
1aab0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
1aac0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
1aad0 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d      if( (wrOnly=
1aae0 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72  =0 || (pCur->cur
1aaf0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
1ab00 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20  teFlag)!=0).    
1ab10 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1ab20 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
1ab30 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
1ab40 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
1ab50 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
1ab60 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1ab70 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
1ab80 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
1ab90 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
1aba0 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
1abb0 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
1abc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1abd0 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
1abe0 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
1abf0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
1ac00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ac10 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
1ac20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
1ac30 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
1ac40 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
1ac50 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
1ac60 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
1ac70 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
1ac80 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1ac90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1aca0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1acb0 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
1acc0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
1acd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ace0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1acf0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
1ad00 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
1ad10 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  0)==0 || pBt->in
1ad20 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
1ad30 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
1ad40 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1ad50 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1ad60 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
1ad70 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
1ad80 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1ad90 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72  Page1;.    asser
1ada0 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t( pPage1->aData
1adb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1adc0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1add0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1ade0 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==1 );.    pBt-
1adf0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
1ae00 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1ae10 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPage1);.  }.}..
1ae20 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
1ae30 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
1ae40 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
1ae50 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
1ae60 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
1ae70 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
1ae80 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
1ae90 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1aea0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1aeb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1aec0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
1aed0 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
1aee0 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
1aef0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
1af00 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
1af10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1af20 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1af30 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
1af40 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
1af50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1af60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
1af70 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1af80 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
1af90 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
1afa0 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
1afb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1afc0 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
1afd0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1afe0 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
1aff0 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
1b000 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
1b010 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
1b020 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
1b030 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
1b040 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
1b050 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
1b060 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
1b070 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
1b080 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
1b090 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
1b0a0 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
1b0b0 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
1b0c0 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
1b0d0 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
1b0e0 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
1b0f0 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
1b100 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
1b110 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
1b120 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
1b130 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
1b140 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
1b150 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
1b160 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
1b170 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
1b180 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
1b190 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
1b1a0 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
1b1b0 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
1b1c0 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
1b1d0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
1b1e0 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
1b1f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b200 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
1b210 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
1b220 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
1b230 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
1b240 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1b250 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
1b260 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1b270 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
1b280 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
1b290 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
1b2a0 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
1b2b0 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
1b2c0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1b2d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
1b2e0 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
1b2f0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
1b300 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b310 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1b320 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
1b330 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1b340 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
1b350 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
1b360 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
1b370 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
1b380 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
1b390 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
1b3a0 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
1b3b0 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
1b3c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
1b3d0 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
1b3e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
1b3f0 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
1b400 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1b410 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1b420 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
1b430 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
1b440 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
1b450 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b460 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b470 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1b480 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
1b490 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1b4a0 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
1b4b0 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
1b4c0 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
1b4d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
1b4e0 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
1b4f0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
1b500 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
1b510 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1b520 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
1b530 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
1b540 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1b550 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
1b560 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
1b570 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
1b580 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
1b590 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
1b5a0 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
1b5b0 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
1b5c0 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
1b5d0 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
1b5e0 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1b5f0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
1b600 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
1b610 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
1b620 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
1b630 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1b640 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1b650 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
1b660 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
1b670 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
1b680 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1b690 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
1b6a0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1b6b0 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
1b6c0 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
1b6d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1b6e0 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
1b6f0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
1b700 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
1b710 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1b720 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
1b730 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
1b740 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
1b750 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1b760 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
1b770 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1b780 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
1b790 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
1b7a0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
1b7b0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1b7c0 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
1b7d0 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
1b7e0 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
1b7f0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
1b800 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
1b810 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
1b820 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
1b830 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
1b840 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
1b850 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
1b860 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
1b870 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
1b880 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
1b890 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
1b8a0 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
1b8b0 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
1b8c0 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
1b8d0 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
1b8e0 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
1b8f0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
1b900 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
1b910 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
1b920 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
1b930 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
1b940 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
1b950 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
1b960 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
1b970 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
1b980 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
1b990 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
1b9a0 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
1b9b0 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
1b9c0 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
1b9d0 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
1b9e0 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
1b9f0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
1ba00 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
1ba10 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
1ba20 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
1ba30 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
1ba40 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1ba50 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
1ba60 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
1ba70 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
1ba80 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
1ba90 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
1baa0 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
1bab0 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
1bac0 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
1bad0 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
1bae0 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
1baf0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
1bb00 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
1bb10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1bb20 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
1bb30 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
1bb40 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
1bb50 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
1bb60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1bb70 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K;..  sqlite3Btr
1bb80 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
1bb90 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1bba0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74  ..  /* If the bt
1bbb0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  ree is already i
1bbc0 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
1bbd0 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a  ction, or it.  *
1bbe0 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  * is already in 
1bbf0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1bc00 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72  on and a read-tr
1bc10 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69  ansaction.  ** i
1bc20 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69  s requested, thi
1bc30 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
1bc40 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  */.  if( p->inTr
1bc50 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1bc60 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d   || (p->inTrans=
1bc70 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21  =TRANS_READ && !
1bc80 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67  wrflag) ){.    g
1bc90 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1bca0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1bcb0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1bcc0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  n==TRANS_WRITE |
1bcd0 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  | IfNotOmitAV(pB
1bce0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d  t->bDoTruncate)=
1bcf0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74  =0 );..  /* Writ
1bd00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e transactions a
1bd10 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  re not possible 
1bd20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64  on a read-only d
1bd30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28  atabase */.  if(
1bd40 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1bd50 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29  & BTS_READ_ONLY)
1bd60 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b  !=0 && wrflag ){
1bd70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1bd80 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67  _READONLY;.    g
1bd90 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1bda0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
1bdb0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1bdc0 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73  _CACHE.  {.    s
1bdd0 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d  qlite3 *pBlock =
1bde0 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e   0;.    /* If an
1bdf0 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68  other database h
1be00 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64  andle has alread
1be10 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65  y opened a write
1be20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20   transaction .  
1be30 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
1be40 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
1be50 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
1be60 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1be70 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71  on is.    ** req
1be80 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
1be90 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
1bea0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72    */.    if( (wr
1beb0 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
1bec0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1bed0 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c  S_WRITE).     ||
1bee0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
1bef0 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d  & BTS_PENDING)!=
1bf00 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1bf10 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1bf20 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65  iter->db;.    }e
1bf30 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
1bf40 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b   ){.      BtLock
1bf50 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66   *pIter;.      f
1bf60 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c  or(pIter=pBt->pL
1bf70 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65  ock; pIter; pIte
1bf80 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b  r=pIter->pNext){
1bf90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
1bfa0 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
1bfb0 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63  .          pBloc
1bfc0 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
1bfd0 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  e->db;.         
1bfe0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1bff0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1c000 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29      if( pBlock )
1c010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1c020 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64  onnectionBlocked
1c030 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b  (p->db, pBlock);
1c040 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1c050 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
1c060 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74  CACHE;.      got
1c070 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
1c080 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1c090 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1c0a0 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1c0b0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1c0c0 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1c0d0 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1c0e0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1c0f0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1c100 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1c110 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1c120 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1c130 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1c140 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1c150 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1c160 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1c170 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1c180 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1c190 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1c1a0 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1c1b0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1c1c0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1c1d0 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1c1e0 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1c1f0 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1c200 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1c210 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1c220 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1c230 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1c240 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1c250 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1c260 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1c270 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1c280 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1c290 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1c2a0 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1c2b0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1c2c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1c2d0 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1c2e0 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1c2f0 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1c300 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1c310 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1c320 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1c330 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1c340 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1c350 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1c360 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1c370 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1c380 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1c390 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1c3a0 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1c3b0 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1c3c0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1c3d0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1c3e0 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1c3f0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1c400 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1c410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c420 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1c430 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1c440 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1c450 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1c460 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1c470 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1c480 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1c490 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1c4a0 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
1c4b0 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
1c4c0 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
1c4d0 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
1c4e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c4f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1c500 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1c510 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1c520 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1c530 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c540 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
1c550 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1c560 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
1c570 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
1c580 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
1c590 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1c5a0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1c5b0 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
1c5c0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
1c5d0 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
1c5e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c5f0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
1c600 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1c610 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
1c620 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
1c630 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1c640 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1c650 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
1c660 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1c670 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
1c680 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
1c690 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
1c6a0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
1c6b0 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
1c6c0 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
1c6d0 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
1c6e0 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
1c6f0 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
1c700 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
1c710 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1c720 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1c730 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
1c740 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
1c750 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
1c760 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
1c770 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1c780 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1c790 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
1c7a0 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
1c7b0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1c7c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1c7d0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1c7e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c7f0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1c800 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1c810 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
1c820 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
1c830 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
1c840 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1c850 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
1c860 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
1c870 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
1c880 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
1c890 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
1c8a0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
1c8b0 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
1c8c0 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
1c8d0 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
1c8e0 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
1c8f0 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
1c900 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1c910 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
1c920 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
1c930 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
1c940 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
1c950 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
1c960 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
1c970 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
1c980 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
1c990 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
1c9a0 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
1c9b0 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
1c9c0 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
1c9d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1c9e0 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
1c9f0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1ca00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1ca10 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
1ca20 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1ca30 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
1ca40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1ca50 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1ca60 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1ca70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ca80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1ca90 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1caa0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1cab0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1cac0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1cad0 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
1cae0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
1caf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1cb00 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
1cb10 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
1cb20 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
1cb30 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
1cb40 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
1cb50 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
1cb60 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
1cb70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
1cb80 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
1cb90 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
1cba0 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1cbb0 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1cbc0 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1cbd0 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
1cbe0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1cbf0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1cc00 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1cc10 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
1cc20 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
1cc30 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
1cc40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1cc50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1cc60 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
1cc70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1cc80 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
1cc90 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1cca0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1ccb0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
1ccc0 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
1ccd0 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
1cce0 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
1ccf0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
1cd00 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
1cd10 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
1cd20 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
1cd30 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1cd40 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
1cd50 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
1cd60 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
1cd70 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1cda0 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
1cdb0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cde0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
1cdf0 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
1ce00 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1ce10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1ce30 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1ce40 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1ce50 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1ce60 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
1ce70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ce80 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1ce90 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1cea0 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73 49   rc = pPage->isI
1ceb0 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  nit ? SQLITE_OK 
1cec0 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  : btreeInitPage(
1ced0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1cee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1cef0 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c  turn rc;.  nCell
1cf00 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1cf10 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
1cf20 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1cf30 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1cf40 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1cf50 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
1cf60 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
1cf70 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
1cf80 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1cf90 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
1cfa0 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1cfb0 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
1cfc0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1cfd0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1cfe0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1cff0 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1d000 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1d010 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
1d020 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1d030 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1d040 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1d050 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
1d060 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1d070 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1d080 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1d090 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1d0a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
1d0b0 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73  here on pPage is
1d0c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61   a pointer to pa
1d0d0 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66  ge iFrom.  Modif
1d0e0 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
1d0f0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69  o.** that it poi
1d100 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61  nts to iTo. Para
1d110 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
1d120 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
1d130 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20  f pointer to.** 
1d140 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
1d150 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
1d160 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
1d170 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
1d180 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1d190 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1d1a0 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
1d1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1d1c0 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
1d1d0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1d1e0 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
1d1f0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1d200 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1d210 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
1d220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d230 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
1d240 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
1d250 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
1d260 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1d270 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
1d280 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
1d290 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1d2a0 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
1d2b0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1d2c0 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
1d2d0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
1d2e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d2f0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1d300 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
1d310 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
1d320 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
1d330 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1d340 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d350 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1d360 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1d370 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
1d380 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
1d390 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28  DbPage) );.  if(
1d3a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1d3b0 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20  VERFLOW2 ){.    
1d3c0 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  /* The pointer i
1d3d0 73 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72  s always the fir
1d3e0 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68  st 4 bytes of th
1d3f0 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
1d400 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ase.  */.    if(
1d410 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1d420 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29  >aData)!=iFrom )
1d430 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1d440 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
1d450 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
1d460 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
1d470 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
1d480 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1d490 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
1d4a0 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ell;.    int rc;
1d4b0 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  ..    rc = pPage
1d4c0 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54  ->isInit ? SQLIT
1d4d0 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74  E_OK : btreeInit
1d4e0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
1d4f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1d500 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d   rc;.    nCell =
1d510 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1d520 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
1d530 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1d540 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
1d550 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
1d560 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
1d570 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1d580 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
1d590 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
1d5a0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
1d5b0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
1d5c0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
1d5d0 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e        if( info.n
1d5e0 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c  Local<info.nPayl
1d5f0 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
1d600 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e   if( pCell+info.
1d610 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61  nSize > pPage->a
1d620 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d  Data+pPage->pBt-
1d630 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
1d640 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1d650 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1d660 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
1d670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d680 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
1d690 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  et4byte(pCell+in
1d6a0 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20  fo.nSize-4) ){. 
1d6b0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
1d6c0 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1d6d0 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20  Size-4, iTo);.  
1d6e0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1d6f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
1d710 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
1d720 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
1d730 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1d740 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1d750 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
1d760 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1d770 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1d780 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
1d790 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
1d7a0 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
1d7b0 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
1d7c0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
1d7d0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1d7e0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1d7f0 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
1d800 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d810 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
1d820 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1d830 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1d840 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1d850 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
1d860 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   iTo);.    }.  }
1d870 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1d880 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  _OK;.}.../*.** M
1d890 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74  ove the open dat
1d8a0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
1d8b0 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69  ge to location i
1d8c0 46 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20  FreePage in the 
1d8d0 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68  .** database. Th
1d8e0 65 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65  e pDbPage refere
1d8f0 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  nce remains vali
1d900 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43  d..**.** The isC
1d910 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63  ommit flag indic
1d920 61 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20  ates that there 
1d930 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65  is no need to re
1d940 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74  member that.** t
1d950 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
1d960 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
1d970 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
1d980 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67  page pDbPage->pg
1d990 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72  no .** can be wr
1d9a0 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61  itten to. The ca
1d9b0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1d9c0 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f   promised not to
1d9d0 20 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a   write to that.*
1d9e0 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  * page..*/.stati
1d9f0 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61  c int relocatePa
1da00 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1da10 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
1da20 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d  * Btree */.  Mem
1da30 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20  Page *pDbPage,  
1da40 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61        /* Open pa
1da50 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20  ge to move */.  
1da60 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
1da70 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1da80 74 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65  ter map 'type' e
1da90 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
1daa0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50   */.  Pgno iPtrP
1dab0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  age,           /
1dac0 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70  * Pointer map 'p
1dad0 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f  age-no' entry fo
1dae0 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  r pDbPage */.  P
1daf0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20  gno iFreePage,  
1db00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1db10 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20  ocation to move 
1db20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20  pDbPage to */.  
1db30 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20  int isCommit    
1db40 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f           /* isCo
1db50 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64  mmit flag passed
1db60 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1db70 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  Movepage */.){. 
1db80 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61   MemPage *pPtrPa
1db90 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge;   /* The pag
1dba0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
1dbb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62  a pointer to pDb
1dbc0 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1dbd0 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65  DbPage = pDbPage
1dbe0 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20  ->pgno;.  Pager 
1dbf0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
1dc00 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
1dc10 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  ..  assert( eTyp
1dc20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1dc30 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  OW2 || eType==PT
1dc40 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c  RMAP_OVERFLOW1 |
1dc50 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d  | .      eType==
1dc60 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1dc70 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1dc80 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65  OTPAGE );.  asse
1dc90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1dca0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1dcb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1dcc0 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42  pDbPage->pBt==pB
1dcd0 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  t );..  /* Move 
1dce0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1dcf0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1dd00 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1dd10 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1dd20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1dd30 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1dd40 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1dd50 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1dd60 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1dd70 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1dd80 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1dd90 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1dda0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1ddb0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1ddc0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1ddd0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1dde0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1ddf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1de00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1de10 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1de20 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1de30 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1de40 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1de50 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1de60 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1de70 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1de80 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1de90 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1dea0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1deb0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1dec0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1ded0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1dee0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1def0 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1df00 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1df10 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1df20 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1df30 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1df40 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1df50 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1df60 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1df70 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1df80 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1df90 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1dfa0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1dfb0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1dfc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1dfd0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1dfe0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1dff0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1e000 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1e010 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1e020 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e030 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1e040 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1e060 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1e070 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1e080 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1e090 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1e0a0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1e0b0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1e0c0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1e0d0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1e0e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e0f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e100 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e110 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e120 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1e130 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1e140 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1e150 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1e160 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1e170 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1e180 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1e190 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1e1a0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1e1b0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1e1c0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1e1d0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e1e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1e1f0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1e200 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1e210 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1e220 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e230 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e250 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e260 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1e270 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e290 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e2a0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1e2b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e2c0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1e2d0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1e2e0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1e2f0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1e300 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1e310 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1e320 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1e340 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1e350 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1e360 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1e370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e380 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1e390 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1e3a0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1e3b0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1e3c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1e3d0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1e3e0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1e3f0 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1e400 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1e410 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1e420 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1e430 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1e440 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1e450 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1e460 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1e470 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1e480 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1e490 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1e4a0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1e4b0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1e4c0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1e4d0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1e4e0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1e4f0 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1e500 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1e510 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1e520 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1e530 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1e540 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1e550 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1e560 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1e570 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1e580 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1e590 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1e5a0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1e5b0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1e5c0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1e5d0 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1e5e0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1e5f0 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1e600 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1e610 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1e620 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1e630 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1e640 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1e650 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1e660 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1e670 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1e680 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1e690 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1e6a0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1e6b0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1e6c0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1e6d0 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1e6e0 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1e6f0 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1e700 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1e710 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1e720 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1e730 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1e740 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1e750 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1e760 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1e770 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1e780 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1e790 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1e7a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e7b0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1e7c0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1e7d0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1e7e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1e7f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1e800 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1e810 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1e820 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1e830 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1e840 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1e850 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1e860 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1e870 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1e880 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1e890 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1e8a0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e8b0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e8c0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1e8d0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1e8e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8f0 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1e900 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1e910 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1e920 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1e930 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e950 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e960 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1e970 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e980 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e990 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e9a0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1e9b0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1e9c0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1e9d0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1e9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1e9f0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1ea00 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1ea10 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1ea20 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1ea30 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1ea40 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1ea50 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1ea60 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1ea70 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1ea80 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1ea90 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1eaa0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1eab0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1eac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1ead0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1eae0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1eaf0 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1eb00 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1eb10 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1eb20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1eb30 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1eb40 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1eb50 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1eb60 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1eb70 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1eb80 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1eb90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1eba0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ebb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ebc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1ebd0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1ebe0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1ebf0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1ec00 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1ec10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1ec20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1ec30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec40 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1ec50 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1ec60 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1ec70 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1ec80 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1ec90 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1eca0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1ecb0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1ecc0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1ecd0 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1ece0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1ecf0 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1ed00 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1ed10 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1ed20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1ed30 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1ed40 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1ed50 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ed60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ed70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ed80 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1ed90 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1eda0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1edb0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1edc0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1edd0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1ede0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1edf0 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1ee00 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1ee10 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1ee20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1ee30 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1ee40 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1ee50 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1ee60 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1ee70 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1ee80 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1ee90 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1eea0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1eeb0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1eec0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1eed0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1eee0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1eef0 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1ef00 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1ef10 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1ef20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1ef30 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1ef40 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1ef50 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1ef60 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1ef70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1ef80 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1ef90 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1efa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1efb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1efc0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1efd0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1efe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1eff0 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1f000 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1f010 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1f020 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1f030 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1f040 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1f050 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1f060 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1f070 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1f080 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1f090 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1f0a0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1f0b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1f0c0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1f0d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f0e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f0f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f100 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1f110 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f120 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1f130 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1f140 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1f150 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f160 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1f170 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1f180 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1f190 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1f1a0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1f1b0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1f1c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f1d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1f1e0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1f1f0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1f200 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1f210 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1f220 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1f230 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1f240 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1f250 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1f260 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1f270 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f280 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1f290 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1f2a0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1f2b0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1f2c0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1f2d0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1f2e0 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1f2f0 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f320 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1f330 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1f340 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f360 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1f370 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1f380 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1f390 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1f3a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f3b0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1f3c0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1f3d0 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1f3e0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1f3f0 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1f400 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1f410 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1f420 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1f430 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1f440 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1f450 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f460 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1f470 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f480 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1f490 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1f4a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f4b0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1f4c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1f4d0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1f4e0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1f4f0 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1f500 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1f510 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1f520 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1f530 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1f540 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1f550 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1f560 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1f570 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1f580 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1f590 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1f5a0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1f5b0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1f5c0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1f5d0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1f5e0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1f5f0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1f600 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1f610 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1f620 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1f630 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1f640 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1f650 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1f660 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1f670 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1f680 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1f690 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f6a0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1f6b0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1f6c0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1f6d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1f6e0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1f6f0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1f700 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1f710 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1f720 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1f730 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1f740 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1f750 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1f760 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1f770 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1f780 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f790 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1f7a0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1f7b0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1f7c0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1f7d0 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1f7e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f7f0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1f810 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1f820 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1f830 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1f840 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f860 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1f870 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1f880 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1f890 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1f8a0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1f8b0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1f8c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f8d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1f8e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f8f0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1f900 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1f910 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1f920 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1f930 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1f940 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1f950 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f960 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1f970 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1f980 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1f990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f9a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1f9b0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1f9c0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1f9d0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1f9e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
1f9f0 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
1fa00 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
1fa10 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
1fa20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
1fa30 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
1fa40 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
1fa50 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1fa60 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
1fa70 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
1fa80 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
1fa90 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
1faa0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
1fab0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
1fac0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
1fad0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
1fae0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
1faf0 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
1fb00 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
1fb10 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
1fb20 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
1fb30 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
1fb40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1fb50 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1fb60 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
1fb70 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
1fb80 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
1fb90 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
1fba0 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
1fbb0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1fbc0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1fbd0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
1fbe0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
1fbf0 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
1fc00 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
1fc10 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
1fc20 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
1fc30 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
1fc40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1fc50 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
1fc60 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
1fc70 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
1fc80 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
1fc90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1fca0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
1fcb0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
1fcc0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
1fcd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1fce0 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
1fcf0 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
1fd00 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
1fd10 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
1fd20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
1fd30 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
1fd40 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1fd50 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
1fd60 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1fd70 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
1fd80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1fd90 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1fda0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
1fdb0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
1fdc0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
1fdd0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
1fde0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
1fdf0 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
1fe00 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
1fe10 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
1fe20 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
1fe30 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
1fe40 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
1fe50 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
1fe60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
1fe70 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1fe80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1fe90 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
1fea0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1feb0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1fec0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
1fed0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1fee0 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
1fef0 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
1ff00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1ff10 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1ff20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
1ff30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
1ff40 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
1ff50 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1ff60 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
1ff70 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
1ff80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
1ff90 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
1ffa0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
1ffb0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
1ffc0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
1ffd0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
1ffe0 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
1fff0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
20000 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
20010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20020 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
20030 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
20040 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20050 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20060 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
20070 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
20080 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
20090 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
200a0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
200b0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
200c0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
200d0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
200e0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
200f0 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
20100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
20120 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20130 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
20140 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
20150 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
20160 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
20170 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
20180 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
20190 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
201a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
201b0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
201c0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
201d0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
201e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
201f0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
20200 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
20210 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
20220 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
20230 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
20240 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
20250 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
20260 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
20270 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
20280 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
20290 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
202a0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
202b0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
202c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
202d0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
202e0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
202f0 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
20300 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
20310 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
20320 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
20330 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
20340 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
20350 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
20360 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
20370 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
20380 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
20390 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
203a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
203b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
203c0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
203d0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
203e0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
203f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
20400 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
20410 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
20420 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
20430 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
20440 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
20450 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
20460 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
20470 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
20480 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
20490 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
204a0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
204b0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
204c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
204d0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
204e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
204f0 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
20500 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
20510 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
20520 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
20530 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
20540 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
20550 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
20560 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
20570 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20580 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
20590 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
205a0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
205b0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
205c0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
205d0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
205e0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
205f0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
20600 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
20610 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
20620 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
20630 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
20640 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
20650 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
20660 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
20670 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
20680 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
20690 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
206a0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
206b0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
206c0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
206d0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
206e0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
206f0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
20700 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
20710 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
20720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
20730 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20740 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
20750 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
20760 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
20770 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20780 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
20790 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
207a0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
207b0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
207c0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
207d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
207e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
207f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20800 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
20810 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
20820 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
20830 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
20840 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20850 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20860 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20870 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20880 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20890 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
208a0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
208b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
208c0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
208d0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
208e0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
208f0 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
20900 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20910 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
20920 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
20930 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
20940 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20950 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20960 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20970 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20980 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
20990 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
209a0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
209b0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
209c0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
209d0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
209e0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
209f0 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
20a00 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
20a10 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20a20 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
20a30 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
20a40 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
20a50 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
20a60 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20a70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
20a80 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
20a90 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
20aa0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
20ab0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
20ac0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
20ad0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
20ae0 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
20af0 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
20b00 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
20b10 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
20b20 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
20b30 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
20b40 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
20b50 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
20b60 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
20b70 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
20b80 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20b90 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
20ba0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
20bb0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
20bc0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
20bd0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
20be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
20bf0 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
20c00 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
20c10 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
20c20 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
20c30 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
20c40 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
20c50 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
20c60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
20c70 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
20c80 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
20c90 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
20ca0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
20cb0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
20cc0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
20cd0 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
20ce0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
20cf0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
20d00 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
20d10 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
20d20 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
20d30 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
20d40 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
20d50 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
20d60 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
20d70 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
20d80 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
20d90 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
20da0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
20db0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
20dc0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
20dd0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
20de0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
20df0 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
20e00 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
20e10 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
20e20 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
20e30 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
20e40 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
20e50 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
20e60 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
20e70 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
20e80 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
20e90 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
20ea0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
20eb0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
20ec0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
20ed0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20ee0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
20ef0 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
20f00 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
20f10 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
20f20 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20f30 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
20f40 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
20f50 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
20f60 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
20f70 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
20f80 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
20f90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
20fa0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
20fb0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
20fc0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
20fd0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
20fe0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
20ff0 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
21000 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
21010 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
21020 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
21030 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
21040 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
21050 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
21060 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
21070 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
21080 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
21090 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
210a0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
210b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
210c0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
210d0 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
210e0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
210f0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21100 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
21110 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
21120 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
21130 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
21140 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
21150 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
21160 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
21170 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
21180 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
21190 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
211a0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
211b0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
211c0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
211d0 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
211e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
211f0 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
21200 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
21210 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
21220 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
21230 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
21240 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
21250 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
21260 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
21270 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
21280 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
21290 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
212a0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
212b0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
212c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
212d0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
212e0 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
212f0 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
21300 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
21310 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21320 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
21330 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
21340 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
21350 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
21360 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
21370 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
21380 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
21390 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
213a0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
213b0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
213c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
213d0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
213e0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
213f0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
21400 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
21410 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
21420 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21430 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
21440 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
21450 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
21460 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
21470 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21480 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
21490 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
214a0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
214b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
214c0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
214d0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
214e0 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
214f0 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
21500 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
21510 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
21520 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
21530 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
21540 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21550 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
21560 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
21570 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21580 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21590 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
215a0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
215b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
215c0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
215d0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
215e0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
215f0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
21600 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
21610 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
21620 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
21630 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
21640 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
21650 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21660 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
21670 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
21680 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
21690 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
216a0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
216b0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
216c0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
216d0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
216e0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
216f0 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
21700 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
21710 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21720 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21730 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21740 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
21750 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
21760 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21770 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
21780 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
21790 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
217a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
217b0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
217c0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
217d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
217e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
217f0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21800 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
21810 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
21820 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21830 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21840 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21850 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
21860 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
21870 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
21880 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
21890 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
218a0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
218b0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
218c0 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
218d0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
218e0 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
218f0 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
21900 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
21910 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
21920 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
21930 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
21940 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
21950 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
21960 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
21970 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
21980 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
21990 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
219a0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
219b0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
219c0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
219d0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
219e0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
219f0 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
21a00 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
21a10 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
21a20 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
21a30 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
21a40 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
21a50 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
21a60 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
21a70 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
21a80 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
21a90 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
21aa0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
21ab0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
21ac0 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
21ad0 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
21ae0 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
21af0 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
21b00 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
21b10 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
21b20 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
21b30 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
21b40 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
21b50 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
21b60 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
21b70 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
21b80 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
21b90 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
21ba0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
21bb0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
21bc0 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
21bd0 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
21be0 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
21bf0 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
21c00 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
21c10 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
21c20 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
21c30 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
21c40 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
21c50 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
21c60 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
21c70 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
21c80 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
21c90 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
21ca0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
21cb0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
21cc0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
21cd0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
21ce0 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
21cf0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
21d00 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
21d10 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
21d20 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
21d30 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
21d40 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
21d50 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
21d60 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
21d70 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
21d80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
21d90 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
21da0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
21db0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
21dc0 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
21dd0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
21de0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
21df0 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
21e00 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
21e10 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
21e20 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
21e30 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
21e40 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
21e50 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
21e60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
21e70 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
21e80 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
21e90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21ea0 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
21eb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
21ec0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
21ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21ee0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
21f00 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
21f10 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
21f20 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
21f30 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
21f40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
21f60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
21f70 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
21f80 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
21f90 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
21fa0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
21fb0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
21fc0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
21fd0 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c  }.      btreeRel
21fe0 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
21ff0 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  es(p);.    }.   
22000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22010 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
22020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22030 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
22040 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
22050 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
22060 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
22070 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
22080 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
22090 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
220a0 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
220b0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
220c0 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
220d0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
220e0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
220f0 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
22100 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
22110 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
22120 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
22130 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
22140 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
22150 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
22160 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
22170 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
22180 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
22190 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
221a0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
221b0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
221c0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
221d0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
221e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
221f0 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
22200 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
22210 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
22220 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
22230 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
22240 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
22250 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
22260 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
22270 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
22280 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
22290 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
222a0 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
222b0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
222c0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
222d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
222e0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
222f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
22300 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
22310 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
22320 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
22330 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
22340 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
22350 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22360 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
22370 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
22380 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
22390 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
223a0 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
223b0 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
223c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
223d0 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
223e0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
223f0 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
22400 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
22410 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
22420 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
22430 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
22440 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22450 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
22460 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
22470 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
22480 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22490 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
224a0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
224b0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
224c0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
224d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
224e0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
224f0 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
22500 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
22510 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
22520 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
22530 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
22540 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
22550 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
22560 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
22570 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
22580 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
22590 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
225a0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
225b0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
225c0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
225d0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
225e0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
225f0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
22600 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22610 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
22620 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
22630 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
22640 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
22650 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
22660 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22670 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
22680 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
22690 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
226a0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
226b0 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  One(pPage1);.   
226c0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
226d0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
226e0 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20  (pBt, 1)==0 );. 
226f0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
22700 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
22710 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
22720 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
22730 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
22740 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
22750 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22760 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22770 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22780 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
22790 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
227a0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
227b0 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c  tion can be roll
227c0 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
227d0 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
227e0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
227f0 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
22800 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
22810 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
22820 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
22830 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
22840 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
22850 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22860 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
22870 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
22880 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
22890 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
228a0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
228b0 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
228c0 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
228d0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
228e0 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
228f0 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
22900 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
22910 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
22920 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
22930 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
22940 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
22950 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
22960 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
22970 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
22980 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
22990 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
229a0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
229b0 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
229c0 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
229d0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
229e0 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
229f0 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
22a00 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
22a10 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
22a20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
22a30 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
22a40 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
22a50 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
22a60 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
22a70 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
22a80 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
22a90 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
22aa0 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
22ab0 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
22ac0 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
22ad0 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
22ae0 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
22af0 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
22b00 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
22b10 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
22b20 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
22b30 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
22b40 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
22b50 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
22b60 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
22b70 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
22b80 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
22b90 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
22ba0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
22bb0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
22bc0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
22bd0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
22be0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
22bf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
22c00 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
22c10 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
22c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
22c30 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
22c40 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
22c50 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
22c60 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
22c70 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
22c80 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
22c90 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
22ca0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
22cb0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
22cc0 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
22cd0 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
22ce0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
22cf0 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
22d00 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
22d10 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
22d20 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
22d30 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
22d40 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
22d50 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
22d60 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
22d70 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
22d80 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
22d90 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
22da0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
22db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22dc0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
22dd0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
22de0 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
22df0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
22e00 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
22e10 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
22e20 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
22e30 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
22e40 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
22e50 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
22e60 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
22e70 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
22e80 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
22e90 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
22ea0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
22eb0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
22ec0 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
22ed0 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
22ee0 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
22ef0 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
22f00 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
22f10 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
22f20 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
22f30 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
22f40 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
22f50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
22f60 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
22f70 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
22f80 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
22f90 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
22fa0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
22fb0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
22fc0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
22fd0 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
22fe0 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
22ff0 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
23000 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
23010 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
23020 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
23030 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
23040 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23050 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
23060 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
23070 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
23080 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
23090 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
230a0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
230b0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
230c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
230d0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
230e0 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
230f0 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
23100 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
23110 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
23120 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
23130 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
23140 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
23150 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
23160 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
23170 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
23180 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
23190 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
231a0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
231b0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
231c0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
231d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
231e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
231f0 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
23200 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
23210 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
23220 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23230 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23240 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
23250 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
23260 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
23270 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
23280 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
23290 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
232a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
232b0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
232c0 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
232d0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
232e0 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
232f0 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
23300 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
23310 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
23320 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
23330 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
23340 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
23350 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
23360 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
23370 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
23380 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
23390 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
233a0 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
233b0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
233c0 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
233d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
233e0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
233f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23400 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
23410 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
23420 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
23430 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
23440 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
23450 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
23460 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
23470 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
23480 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
23490 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
234a0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
234b0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
234c0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
234d0 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
234e0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
234f0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
23500 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
23510 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
23520 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
23530 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
23540 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  ** If the BTREE_
23550 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46  WRCSR bit of wrF
23560 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
23570 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
23580 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65  n only.** be use
23590 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20  d for reading.  
235a0 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
235b0 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  SR bit is set, t
235c0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hen the cursor.*
235d0 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  * can be used fo
235e0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
235f0 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
23600 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
23610 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20   writing.** are 
23620 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
23630 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
23640 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
23650 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a   met in order.**
23660 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20   for writing to 
23670 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
23680 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
23690 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
236a0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
236b0 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54  ag containing BT
236c0 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20  REE_WRCSR.**.** 
236d0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
236e0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
236f0 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
23700 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
23710 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
23720 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
23730 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
23740 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
23750 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
23760 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
23770 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
23780 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
23790 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
237a0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
237b0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
237c0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
237d0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
237e0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
237f0 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
23800 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
23810 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
23820 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
23830 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
23840 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
23850 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
23860 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
23870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23880 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46  *.** The BTREE_F
23890 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20  ORDELETE bit of 
238a0 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f  wrFlag may optio
238b0 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20  nally be set if 
238c0 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69  BTREE_WRCSR.** i
238d0 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45  s set.  If FORDE
238e0 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61  LETE is set, tha
238f0 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  t is a hint to t
23900 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
23910 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63  n that.** this c
23920 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  ursor will only 
23930 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20  be used to seek 
23940 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e  to and delete en
23950 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65  tries of an inde
23960 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  x.** as part of 
23970 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20  a larger DELETE 
23980 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
23990 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69  FORDELETE hint i
239a0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a  s not used by.**
239b0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
239c0 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20  tion.  But in a 
239d0 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74  hypothetical alt
239e0 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65  ernative storage
239f0 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77   engine .** in w
23a00 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69  hich index entri
23a10 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
23a20 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
23a30 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  n corresponding 
23a40 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72  table.** rows ar
23a50 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46  e deleted, the F
23a60 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73  ORDELETE flag is
23a70 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c   a hint that all
23a80 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45   SEEK and DELETE
23a90 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  .** operations o
23aa0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61  n this cursor ca
23ab0 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20  n be no-ops and 
23ac0 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69  all READ operati
23ad0 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75  ons can .** retu
23ae0 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32  rn a null row (2
23af0 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30  -bytes: 0x01 0x0
23b00 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  0)..**.** No che
23b10 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
23b20 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
23b30 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
23b40 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
23b50 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
23b60 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
23b70 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
23b80 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
23b90 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
23ba0 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
23bb0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
23bc0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
23bd0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
23be0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
23bf0 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
23c00 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
23c10 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
23c20 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
23c30 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
23c40 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
23c50 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
23c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23c80 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
23c90 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23cb0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
23cc0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
23cd0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
23ce0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
23cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d00 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
23d10 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
23d20 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
23d30 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
23d40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
23d50 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
23d60 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
23d70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
23d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d90 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
23da0 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
23db0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
23dc0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
23dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23de0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
23df0 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
23e00 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
23e30 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
23e40 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
23e50 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
23e60 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
23e70 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
23e80 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  0 .       || wrF
23e90 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52  lag==BTREE_WRCSR
23ea0 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
23eb0 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52  ag==(BTREE_WRCSR
23ec0 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45  |BTREE_FORDELETE
23ed0 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ) .  );..  /* Th
23ee0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
23ef0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
23f00 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
23f10 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
23f20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
23f30 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
23f40 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
23f50 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
23f60 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
23f70 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
23f80 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
23f90 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
23fa0 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
23fb0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
23fc0 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
23fd0 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
23fe0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
23ff0 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
24000 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31  !=0, (wrFlag?2:1
24010 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  )) );.  assert( 
24020 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
24030 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
24040 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
24050 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
24060 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
24070 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
24080 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
24090 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
240a0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
240b0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
240c0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
240d0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
240e0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
240f0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
24100 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
24110 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
24120 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
24130 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
24140 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
24150 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
24160 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
24170 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
24180 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
24190 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
241a0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
241b0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
241c0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
241d0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
241e0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
241f0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
24200 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
24210 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
24220 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
24230 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
24240 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
24250 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
24260 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
24270 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
24280 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
24290 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
242a0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
242b0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
242c0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
242d0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
242e0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
242f0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
24300 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
24310 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
24320 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
24330 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
24340 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
24350 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
24360 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
24370 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
24380 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
24390 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
243a0 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
243b0 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
243c0 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
243d0 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
243e0 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
243f0 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
24400 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
24410 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
24420 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
24430 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
24440 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
24450 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
24460 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
24470 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
24480 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
24490 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
244a0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
244b0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
244c0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
244d0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
244e0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
244f0 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
24500 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
24510 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
24520 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
24530 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24550 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
24560 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
24570 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24590 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
245a0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
245b0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
245c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
245f0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
24600 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
24610 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24630 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
24640 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
24650 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
24660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24680 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
24690 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
246a0 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
246b0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
246c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
246d0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
246e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
246f0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
24700 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
24710 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
24720 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
24730 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
24740 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
24750 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24760 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
24770 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
24780 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
24790 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
247a0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
247b0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
247c0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
247d0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
247e0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
247f0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
24800 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
24810 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
24820 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
24830 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
24840 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
24850 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
24860 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
24870 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
24880 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24890 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
248a0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
248b0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
248c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
248d0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
248e0 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
248f0 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
24900 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
24910 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
24920 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
24930 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
24940 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
24950 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
24960 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
24970 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
24980 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
24990 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
249a0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
249b0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
249c0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
249d0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
249e0 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
249f0 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
24a00 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
24a10 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
24a20 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
24a30 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
24a40 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
24a50 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
24a60 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55 52 53  BtCursor, BTCURS
24a70 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54 29  OR_FIRST_UNINIT)
24a80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
24a90 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
24aa0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
24ab0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24ac0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
24ad0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
24ae0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
24af0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
24b00 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
24b10 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
24b20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
24b30 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
24b40 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
24b50 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
24b60 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
24b70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
24b80 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
24b90 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
24ba0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
24bb0 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
24bc0 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
24bd0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
24be0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
24bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43  }else{.      BtC
24c00 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70  ursor *pPrev = p
24c10 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20  Bt->pCursor;.   
24c20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
24c30 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  f( pPrev->pNext=
24c40 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =pCur ){.       
24c50 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20     pPrev->pNext 
24c60 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
24c70 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
24c80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24c90 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d    pPrev = pPrev-
24ca0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77  >pNext;.      }w
24cb0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72  hile( ALWAYS(pPr
24cc0 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ev) );.    }.   
24cd0 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
24ce0 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
24cf0 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  );.    unlockBtr
24d00 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
24d10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
24d20 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
24d30 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  w);.    sqlite3_
24d40 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
24d50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
24d60 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
24d70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24d80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24d90 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
24da0 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
24db0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
24dc0 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
24dd0 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
24de0 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
24df0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
24e00 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72  lid, call.** btr
24e10 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
24e20 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
24e30 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
24e40 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
24e50 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
24e60 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
24e70 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
24e80 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
24e90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
24ea0 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72 73  lls to btreePars
24eb0 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e  eCell()..*/.#ifn
24ec0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61  def NDEBUG.  sta
24ed0 74 69 63 20 69 6e 74 20 63 65 6c 6c 49 6e 66 6f  tic int cellInfo
24ee0 45 71 75 61 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a  Equal(CellInfo *
24ef0 61 2c 20 43 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b  a, CellInfo *b){
24f00 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4b 65 79  .    if( a->nKey
24f10 21 3d 62 2d 3e 6e 4b 65 79 20 29 20 72 65 74 75  !=b->nKey ) retu
24f20 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
24f30 3e 70 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 70 50  >pPayload!=b->pP
24f40 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20  ayload ) return 
24f50 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 50  0;.    if( a->nP
24f60 61 79 6c 6f 61 64 21 3d 62 2d 3e 6e 50 61 79 6c  ayload!=b->nPayl
24f70 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  oad ) return 0;.
24f80 20 20 20 20 69 66 28 20 61 2d 3e 6e 4c 6f 63 61      if( a->nLoca
24f90 6c 21 3d 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72  l!=b->nLocal ) r
24fa0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
24fb0 20 61 2d 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53   a->nSize!=b->nS
24fc0 69 7a 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ize ) return 0;.
24fd0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
24fe0 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  }.  static void 
24ff0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
25000 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25010 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
25020 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  o;.    memset(&i
25030 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
25040 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
25050 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
25060 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 2c  pPage, pCur->ix,
25070 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
25080 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
25090 7c 7c 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c  || cellInfoEqual
250a0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
250b0 6e 66 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  nfo) );.  }.#els
250c0 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
250d0 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
250e0 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49  ndif.static SQLI
250f0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
25100 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
25110 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25120 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
25130 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Size==0 ){.    p
25140 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
25150 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
25160 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
25170 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c  ell(pCur->pPage,
25180 70 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d 3e  pCur->ix,&pCur->
25190 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  info);.  }else{.
251a0 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e      assertCellIn
251b0 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  fo(pCur);.  }.}.
251c0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
251d0 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75   /* The next rou
251e0 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77  tine used only w
251f0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
25200 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a  tatements */./*.
25210 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
25220 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75  f the given BtCu
25230 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
25240 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69  A valid cursor i
25250 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73  s one.** that is
25260 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
25270 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20  ing to a row in 
25280 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61  a (non-empty) ta
25290 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ble..** This is 
252a0 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72  a verification r
252b0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f  outine is used o
252c0 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72  nly within asser
252d0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  t() statements..
252e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
252f0 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64  reeCursorIsValid
25300 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
25310 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20  {.  return pCur 
25320 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  && pCur->eState=
25330 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
25340 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55  .#endif /* NDEBU
25350 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  G */.int sqlite3
25360 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
25370 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70  idNN(BtCursor *p
25380 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
25390 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74  pCur!=0 );.  ret
253a0 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65  urn pCur->eState
253b0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
253c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
253d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
253e0 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20   integer key or 
253f0 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61  "rowid" for a ta
25400 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68  ble btree..** Th
25410 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
25420 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63  ly valid for a c
25430 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f  ursor that is po
25440 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a  inting into a.**
25450 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20   ordinary table 
25460 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 63  btree.  If the c
25470 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  ursor points to 
25480 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f  an index btree o
25490 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c  r.** is invalid,
254a0 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
254b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
254c0 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34  ndefined..*/.i64
254d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
254e0 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72  egerKey(BtCursor
254f0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
25500 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
25510 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
25520 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
25530 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
25540 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
25550 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
25560 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
25570 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
25580 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
25590 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
255a0 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f  E_ENABLE_OFFSET_
255b0 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52  SQL_FUNC./*.** R
255c0 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
255d0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
255e0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
255f0 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
25600 70 61 79 6c 6f 61 64 20 74 6f 20 77 68 69 63 68  payload to which
25610 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
25620 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20  ointing..*/.i64 
25630 73 71 6c 69 74 65 33 42 74 72 65 65 4f 66 66 73  sqlite3BtreeOffs
25640 65 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  et(BtCursor *pCu
25650 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
25660 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
25670 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
25680 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
25690 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
256a0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
256b0 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 69  ur);.  return (i
256c0 36 34 29 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61  64)pCur->pBt->pa
256d0 67 65 53 69 7a 65 2a 28 28 69 36 34 29 70 43 75  geSize*((i64)pCu
256e0 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 20 2d  r->pPage->pgno -
256f0 20 31 29 20 2b 0a 20 20 20 20 20 20 20 20 20 28   1) +.         (
25700 69 36 34 29 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  i64)(pCur->info.
25710 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 75 72 2d  pPayload - pCur-
25720 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  >pPage->aData);.
25730 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
25740 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
25750 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a  _SQL_FUNC */../*
25760 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
25770 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
25780 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68  f payload for th
25790 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 43 75  e entry that pCu
257a0 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  r is.** currentl
257b0 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  y pointing to.  
257c0 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65 73  For table btrees
257d0 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  , this will be t
257e0 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20  he amount.** of 
257f0 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64 65 78  data.  For index
25800 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69   btrees, this wi
25810 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20 6f  ll be the size o
25820 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  f the key..**.**
25830 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
25840 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
25850 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
25860 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d  inting to a non-
25870 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e  NULL.** valid en
25880 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  try.  In other w
25890 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e  ords, the callin
258a0 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74  g procedure must
258b0 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68   guarantee.** th
258c0 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  at the cursor ha
258d0 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d  s Cursor.eState=
258e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a  =CURSOR_VALID..*
258f0 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  /.u32 sqlite3Btr
25900 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 42 74  eePayloadSize(Bt
25910 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25920 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25930 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25950 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25960 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74  R_VALID );.  get
25970 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
25980 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69    return pCur->i
25990 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.nPayload;.}.
259a0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
259b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
259c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
259d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
259e0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
259f0 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
25a00 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
25a10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
25a20 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
25a30 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
25a40 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
25a50 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
25a60 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
25a70 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
25a80 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
25a90 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
25aa0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
25ab0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
25ac0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
25ad0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
25ae0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
25af0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
25b00 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
25b10 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
25b20 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
25b30 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
25b40 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
25b50 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
25b60 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
25b70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
25b80 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
25b90 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
25ba0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
25bb0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
25bc0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
25bd0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
25be0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
25bf0 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
25c00 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
25c10 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
25c20 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
25c30 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
25c40 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
25c50 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
25c60 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
25c70 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
25c80 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
25c90 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
25ca0 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
25cb0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
25cc0 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
25cd0 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
25ce0 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
25cf0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
25d00 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
25d10 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
25d20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
25d30 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
25d40 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
25d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
25d60 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
25d70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d90 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
25da0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
25db0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
25dc0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
25dd0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
25de0 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
25df0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
25e00 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
25e10 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
25e20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
25e30 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
25e40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
25e50 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
25e60 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
25e70 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
25e80 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
25e90 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
25ea0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25eb0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
25ec0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
25ed0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
25ee0 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
25ef0 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
25f00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25f10 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
25f20 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
25f30 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
25f40 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
25f50 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
25f60 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
25f70 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
25f80 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
25f90 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
25fa0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
25fb0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
25fc0 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
25fd0 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
25fe0 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
25ff0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
26000 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
26010 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
26020 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
26030 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
26040 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
26050 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
26060 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
26070 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
26080 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
26090 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
260a0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
260b0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
260c0 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
260d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
260e0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
260f0 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
26100 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
26110 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
26120 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
26130 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
26140 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
26150 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
26160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26170 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
26180 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
26190 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
261a0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
261b0 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
261c0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
261d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
261e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
261f0 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
26200 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
26210 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
26220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
26230 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
26240 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
26250 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20  , (ppPage==0) ? 
26260 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
26270 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  LY : 0);.    ass
26280 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
26290 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
262a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
262b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
262c0 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
262d0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
262e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
262f0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
26300 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
26310 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
26320 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
26330 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
26340 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
26350 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
26360 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
26370 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
26380 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
26390 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
263a0 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
263b0 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
263c0 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
263d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
263e0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
263f0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
26400 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
26410 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
26420 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
26430 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
26440 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
26450 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
26460 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
26470 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
26480 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
26490 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
264a0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
264b0 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
264c0 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
264d0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
264e0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
264f0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
26500 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
26510 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
26520 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
26530 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
26540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26550 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
26560 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
26570 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
26580 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
26590 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
265a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
265b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
265c0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
265d0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
265e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
265f0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
26600 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
26610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26620 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
26630 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
26640 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
26650 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
26660 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
26670 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
26680 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
26690 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
266a0 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
266b0 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
266c0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
266d0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
266e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
266f0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
26700 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26710 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
26720 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
26730 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
26740 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
26750 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
26760 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
26770 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
26780 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
26790 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
267a0 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
267b0 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
267c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
267d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
267e0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
267f0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
26800 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
26810 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
26820 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
26830 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
26840 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65  inting to. The e
26850 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  Op.** argument i
26860 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
26870 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
26880 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69    0: The operati
26890 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f  on is a read. Po
268a0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
268b0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
268c0 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  1: The operation
268d0 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70   is a write. Pop
268e0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
268f0 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ow cache..**.** 
26900 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
26910 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
26920 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
26930 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
26940 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
26950 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
26960 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
26970 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
26980 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
26990 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
269a0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
269b0 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
269c0 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
269d0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
269e0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
269f0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
26a00 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
26a10 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
26a20 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69 73  ow pages.** this
26a30 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
26a40 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
26a50 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75   and lazily popu
26a60 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72  late.** the over
26a70 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
26a80 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
26a90 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
26aa0 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20   .** Subsequent 
26ab0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63  calls use this c
26ac0 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65  ache to make see
26ad0 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  king to the supp
26ae0 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20  lied offset .** 
26af0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a  more efficient..
26b00 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76  **.** Once an ov
26b10 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
26b20 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
26b30 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 75  allocated, it mu
26b40 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
26b50 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
26b60 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
26b70 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
26b80 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
26b90 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
26ba0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
26bb0 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
26bc0 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
26bd0 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
26be0 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
26bf0 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
26c00 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
26c10 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
26c20 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
26c30 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
26c40 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
26c50 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
26c60 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
26c70 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
26c80 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
26c90 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
26ca0 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
26cb0 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
26cc0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
26cd0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
26ce0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
26cf0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
26d00 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
26d10 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
26d20 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
26d30 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
26d40 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
26d50 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
26d60 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
26d70 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
26d80 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
26d90 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
26da0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
26db0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
26dc0 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
26dd0 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
26de0 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
26df0 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
26e00 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
26e10 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
26e20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
26e30 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
26e40 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
26e50 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20  Cur->pPage;     
26e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
26e70 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
26e80 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
26e90 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
26ea0 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
26eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
26ec0 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
26ed0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66  elongs to */.#if
26ee0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
26ef0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
26f00 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
26f10 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72  * const pBufStar
26f20 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f 2a  t = pBuf;     /*
26f30 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69 6e   Start of origin
26f40 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a 2f  al out buffer */
26f50 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
26f60 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
26f70 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20  sert( eOp==0 || 
26f80 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eOp==1 );.  asse
26f90 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
26fa0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
26fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
26fc0 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  ->ix<pPage->nCel
26fd0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
26fe0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26ff0 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
27000 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
27010 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
27020 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
27030 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
27040 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69  t+amt <= pCur->i
27050 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
27060 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79 6c  .  assert( aPayl
27070 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  oad > pPage->aDa
27080 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74  ta );.  if( (upt
27090 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50  r)(aPayload - pP
270a0 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70  age->aData) > (p
270b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
270c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
270d0 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  al) ){.    /* Tr
270e0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
270f0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
27100 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
27110 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
27120 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f  .    ** conditio
27130 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61  nal above is rea
27140 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26  lly:.    **    &
27150 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
27160 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
27170 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
27180 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20  >usableSize].   
27190 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61 73   ** but is recas
271a0 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65  t into its curre
271b0 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64  nt form to avoid
271c0 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f   integer overflo
271d0 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a  w problems.    *
271e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
271f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
27200 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  (pPage);.  }..  
27210 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
27220 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
27230 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
27240 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
27250 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
27260 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
27270 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
27280 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
27290 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
272a0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
272b0 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
272c0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
272d0 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
272e0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
272f0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
27300 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
27310 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
27320 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
27330 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
27340 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
27350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
27360 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
27370 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
27380 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
27390 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
273a0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
273b0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
273c0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
273d0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
273e0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
273f0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
27400 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
27410 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
27420 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
27430 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
27440 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
27450 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
27460 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
27470 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
27480 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
27490 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
274a0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
274b0 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
274c0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
274d0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
274e0 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
274f0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
27500 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
27510 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
27520 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
27530 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
27540 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
27550 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
27560 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
27570 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
27580 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
27590 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
275a0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
275b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
275c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
275d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
275e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
275f0 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
27600 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
27610 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
27620 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
27630 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
27640 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d  Cur->aOverflow==
27650 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66  0.       || nOvf
27660 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28 50 67  l*(int)sizeof(Pg
27670 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c  no) > sqlite3Mal
27680 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f  locSize(pCur->aO
27690 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20 20 29  verflow).      )
276a0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
276b0 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
276c0 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
276d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
276e0 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
276f0 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
27700 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
27710 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
27720 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
27730 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
27740 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
27750 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
27760 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
27770 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
27780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
27790 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
277a0 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
277b0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
277c0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
277d0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
277e0 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  dOvfl;.    }else
277f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
27800 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
27810 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
27820 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
27830 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  d the.      ** e
27840 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
27850 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
27860 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
27870 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a  id, skip.      *
27880 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
27890 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
278a0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
278b0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
278c0 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20  Size] ){.       
278d0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
278e0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
278f0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
27900 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
27910 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  dx];.        off
27920 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
27930 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  flSize);.      }
27940 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
27950 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
27960 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20  K && amt>0 );.  
27970 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67    while( nextPag
27980 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
27990 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
279a0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
279b0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
279c0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
279d0 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
279e0 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
279f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
27a00 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
27a10 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20  x]==nextPage.   
27a20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
27a30 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
27a40 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
27a50 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
27a60 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  ge;..      if( o
27a70 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
27a80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
27a90 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
27aa0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
27ab0 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
27ac0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
27ad0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
27ae0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
27af0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
27b00 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
27b10 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
27b20 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
27b30 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
27b40 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
27b50 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
27b60 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
27b70 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
27b80 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
27b90 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
27ba0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
27bb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
27bc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27bd0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
27be0 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
27bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
27c00 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
27c10 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
27c20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
27c30 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
27c40 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
27c50 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
27c60 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
27c70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
27c80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
27c90 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
27ca0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
27cb0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
27cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
27cd0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
27ce0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27cf0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
27d00 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
27d10 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
27d20 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
27d30 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
27d40 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
27d50 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
27d60 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
27d70 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
27d80 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
27d90 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
27da0 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
27db0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
27dc0 2a 66 64 3b 20 20 20 20 20 20 2f 2a 20 46 69 6c  *fd;      /* Fil
27dd0 65 20 66 72 6f 6d 20 77 68 69 63 68 20 74 6f 20  e from which to 
27de0 64 6f 20 64 69 72 65 63 74 20 6f 76 65 72 66 6c  do direct overfl
27df0 6f 77 20 72 65 61 64 20 2a 2f 0a 23 65 6e 64 69  ow read */.#endi
27e00 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
27e10 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
27e20 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
27e30 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
27e40 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
27e50 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
27e60 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
27e70 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
27e80 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
27e90 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
27ea0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
27eb0 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
27ec0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
27ed0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
27ee0 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
27ef0 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
27f00 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
27f10 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
27f20 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
27f30 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
27f40 20 20 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20    **   3) there 
27f50 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74 65  is no open write
27f60 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e  -transaction, an
27f70 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  d.        **   4
27f80 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
27f90 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
27fa0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
27fb0 35 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  5) the page is n
27fc0 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69  ot in the WAL fi
27fd0 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
27fe0 36 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  6) at least 4 by
27ff0 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
28000 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
28010 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
28020 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
28030 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
28040 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
28050 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
28060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
28070 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
28080 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
28090 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
280a0 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
280b0 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
280c0 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
280d0 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
280e0 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
280f0 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
28100 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
28110 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
28120 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
28130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
28160 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
28170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28190 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
281a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  */.         && p
281b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
281c0 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 20 20  n==TRANS_READ   
281d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281e0 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
281f0 20 20 20 20 20 26 26 20 28 66 64 20 3d 20 73 71       && (fd = sq
28200 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
28210 42 74 2d 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d  Bt->pPager))->pM
28220 65 74 68 6f 64 73 20 20 20 20 20 2f 2a 20 28 34  ethods     /* (4
28230 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
28240 20 30 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72   0==sqlite3Pager
28250 55 73 65 57 61 6c 28 70 42 74 2d 3e 70 50 61 67  UseWal(pBt->pPag
28260 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20  er, nextPage)   
28270 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20      /* (5) */.  
28280 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66 5b         && &pBuf[
28290 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20 20  -4]>=pBufStart  
282a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
282c0 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 29  (6) */.        )
282d0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61  {.          u8 a
282e0 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20  Save[4];.       
282f0 20 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20     u8 *aWrite = 
28300 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20  &pBuf[-4];.     
28310 20 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72       assert( aWr
28320 69 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29  ite>=pBufStart )
28330 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65            /* due
28350 20 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   to (6) */.     
28360 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76       memcpy(aSav
28370 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20  e, aWrite, 4);. 
28380 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
28390 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
283a0 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36  aWrite, a+4, (i6
283b0 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a  4)pBt->pageSize*
283c0 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20  (nextPage-1));. 
283d0 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
283e0 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72  e = get4byte(aWr
283f0 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ite);.          
28400 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61  memcpy(aWrite, a
28410 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20  Save, 4);.      
28420 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
28430 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
28440 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
28450 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72  age;.          r
28460 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
28470 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
28480 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50   nextPage, &pDbP
28490 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
284a0 20 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47     (eOp==0 ? PAG
284b0 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
284c0 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29  : 0).          )
284d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
284e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
284f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61  .            aPa
28500 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50  yload = sqlite3P
28510 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50  agerGetData(pDbP
28520 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
28530 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
28540 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b  4byte(aPayload);
28550 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28560 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
28570 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34  Payload[offset+4
28580 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
28590 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
285a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
285b0 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
285c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
285d0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
285e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
285f0 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
28600 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  a;.        if( a
28610 6d 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72  mt==0 ) return r
28620 63 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  c;.        pBuf 
28630 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
28640 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
28650 61 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b  ak;.      iIdx++
28660 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
28670 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28680 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
28690 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61   /* Overflow cha
286a0 69 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72  in ends prematur
286b0 65 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ely */.    retur
286c0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
286d0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
286e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
286f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
28700 74 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64  t of the payload
28710 20 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20   for the row at 
28720 77 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f  which that curso
28730 72 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e  r pCur is curren
28740 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  tly.** pointing.
28750 20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69    "amt" bytes wi
28760 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65  ll be transferre
28770 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20  d into pBuf[].  
28780 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20  The transfer.** 
28790 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65  begins at "offse
287a0 74 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63  t"..**.** pCur c
287b0 61 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  an be pointing t
287c0 6f 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65  o either a table
287d0 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   or an index b-t
287e0 72 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74  ree..** If point
287f0 69 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62  ing to a table b
28800 74 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63  tree, then the c
28810 6f 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69  ontent section i
28820 73 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70  s read.  If.** p
28830 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
28840 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
28850 65 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20  ee then the key 
28860 73 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e  section is read.
28870 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74  .**.** For sqlit
28880 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29  e3BtreePayload()
28890 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
288a0 74 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43  t ensure that pC
288b0 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a  ur is pointing.*
288c0 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77  * to a valid row
288d0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
288e0 46 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65  For sqlite3Btree
288f0 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29  PayloadChecked()
28900 2c 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20  , the.** cursor 
28910 6d 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64  might be invalid
28920 20 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74   or might need t
28930 6f 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65  o be restored be
28940 66 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e  fore being read.
28950 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
28960 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
28970 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
28980 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
28990 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
289a0 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
289b0 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
289c0 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
289d0 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
289e0 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
289f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
28a00 65 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f  ePayload(BtCurso
28a10 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
28a20 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
28a30 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73  id *pBuf){.  ass
28a40 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
28a50 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
28a60 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
28a70 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
28a80 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
28a90 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28aa0 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  && pCur->pPage )
28ab0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28ac0 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  ->ix<pCur->pPage
28ad0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74  ->nCell );.  ret
28ae0 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
28af0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
28b00 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
28b10 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d  har*)pBuf, 0);.}
28b20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72  ../*.** This var
28b30 69 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42  iant of sqlite3B
28b40 74 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f  treePayload() wo
28b50 72 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  rks even if the 
28b60 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a  cursor has not.*
28b70 2a 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f  * in the CURSOR_
28b80 56 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74  VALID state.  It
28b90 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
28ba0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
28bb0 62 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65  b_read().** inte
28bc0 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  rface..*/.#ifnde
28bd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
28be0 43 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51  CRBLOB.static SQ
28bf0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
28c00 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43  t accessPayloadC
28c10 68 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  hecked(.  BtCurs
28c20 6f 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20  or *pCur,.  u32 
28c30 6f 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d  offset,.  u32 am
28c40 74 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a  t,.  void *pBuf.
28c50 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
28c60 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
28c70 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
28c80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
28c90 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
28ca0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28cb0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
28cc0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74  ur) );.  rc = bt
28cd0 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
28ce0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
28cf0 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63    return rc ? rc
28d00 20 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64   : accessPayload
28d10 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
28d20 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  mt, pBuf, 0);.}.
28d30 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28d40 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42  PayloadChecked(B
28d50 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
28d60 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
28d70 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
28d80 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
28d90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
28da0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
28db0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
28dc0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20  red(pCur) );.   
28dd0 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61   return accessPa
28de0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
28df0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
28e00 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28e10 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
28e20 6c 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72  loadChecked(pCur
28e30 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
28e40 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Buf);.  }.}.#end
28e50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
28e60 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f  T_INCRBLOB */../
28e70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
28e80 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
28e90 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
28ea0 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
28eb0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
28ec0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
28ed0 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
28ee0 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
28ef0 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
28f00 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
28f10 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
28f20 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
28f30 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
28f40 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
28f50 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
28f60 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
28f70 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
28f80 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
28f90 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
28fa0 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
28fb0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
28fc0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
28fd0 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
28fe0 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
28ff0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
29000 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
29010 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
29020 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
29030 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
29040 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
29050 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
29060 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
29070 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
29080 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
29090 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
290a0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
290b0 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
290c0 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
290d0 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
290e0 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
290f0 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
29100 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
29110 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
29120 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
29130 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
29140 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
29150 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
29160 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
29170 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
29180 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
29190 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
291a0 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
291b0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
291c0 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
291d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
291e0 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
291f0 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
29200 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
29210 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
29220 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
29230 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
29240 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
29250 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
29260 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
29270 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
29280 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
29290 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
292a0 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
292b0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
292c0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
292d0 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
292e0 20 69 6e 74 20 61 6d 74 3b 0a 20 20 61 73 73 65   int amt;.  asse
292f0 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
29300 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
29310 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
29320 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
29330 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
29340 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
29350 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
29360 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
29370 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
29380 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29390 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
293a0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
293b0 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70  pCur->ix<pCur->p
293c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
293d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
293e0 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20  nfo.nSize>0 );. 
293f0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29400 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75  nfo.pPayload>pCu
29410 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20  r->pPage->aData 
29420 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
29430 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29440 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70  >info.pPayload<p
29450 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
29460 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
29470 42 29 3b 0a 20 20 61 6d 74 20 3d 20 70 43 75 72  B);.  amt = pCur
29480 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
29490 20 69 66 28 20 61 6d 74 3e 28 69 6e 74 29 28 70   if( amt>(int)(p
294a0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74  Cur->pPage->aDat
294b0 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66  aEnd - pCur->inf
294c0 6f 2e 70 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20  o.pPayload) ){. 
294d0 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 74     /* There is t
294e0 6f 6f 20 6c 69 74 74 6c 65 20 73 70 61 63 65 20  oo little space 
294f0 6f 6e 20 74 68 65 20 70 61 67 65 20 66 6f 72 20  on the page for 
29500 74 68 65 20 65 78 70 65 63 74 65 64 20 61 6d 6f  the expected amo
29510 75 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f  unt.    ** of lo
29520 63 61 6c 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74  cal content. Dat
29530 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
29540 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73  rrupt. */.    as
29550 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
29560 20 29 3b 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41   );.    amt = MA
29570 58 28 30 2c 20 28 69 6e 74 29 28 70 43 75 72 2d  X(0, (int)(pCur-
29580 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64  >pPage->aDataEnd
29590 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   - pCur->info.pP
295a0 61 79 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20  ayload));.  }.  
295b0 2a 70 41 6d 74 20 3d 20 28 75 33 32 29 61 6d 74  *pAmt = (u32)amt
295c0 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64  ;.  return (void
295d0 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  *)pCur->info.pPa
295e0 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  yload;.}.../*.**
295f0 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   For the entry t
29600 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20  hat cursor pCur 
29610 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74  is point to, ret
29620 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62  urn as.** many b
29630 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20  ytes of the key 
29640 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61  or data as are a
29650 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
29660 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20  local.** b-tree 
29670 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65  page.  Write the
29680 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
29690 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20  able bytes into 
296a0 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  *pAmt..**.** The
296b0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
296c0 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20  d is ephemeral. 
296d0 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61   The key/data ma
296e0 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20  y move.** or be 
296f0 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65  destroyed on the
29700 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e   next call to an
29710 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c  y Btree routine,
29720 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61  .** including ca
29730 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74  lls from other t
29740 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74  hreads against t
29750 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a  he same cache..*
29760 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78  * Hence, a mutex
29770 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64   on the BtShared
29780 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
29790 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
297a0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
297b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
297c0 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74  utines is used t
297d0 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65  o get quick acce
297e0 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61  ss to key and da
297f0 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d  ta.** in the com
29800 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e  mon case where n
29810 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
29820 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f   are used..*/.co
29830 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
29840 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74  3BtreePayloadFet
29850 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
29860 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
29870 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
29880 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
29890 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
298a0 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
298b0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
298c0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
298d0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
298e0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
298f0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
29900 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
29910 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
29920 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
29930 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68  TE_CORRUPT if th
29940 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c  e page-header fl
29950 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20  ags field of.** 
29960 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61  the new child pa
29970 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ge does not matc
29980 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c  h the flags fiel
29990 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  d of the parent 
299a0 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69  (i.e..** if an i
299b0 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61  ntkey page appea
299c0 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72  rs to be the par
299d0 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74  ent of a non-int
299e0 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20  key page, or.** 
299f0 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a  vice-versa)..*/.
29a00 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
29a10 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
29a20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
29a30 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  no){.  BtShared 
29a40 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
29a50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
29a60 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29a70 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29a80 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
29a90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
29aa0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29ab0 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
29ac0 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
29ad0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
29ae0 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
29af0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
29b00 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
29b10 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
29b20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29b30 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72  BKPT;.  }.  pCur
29b40 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
29b50 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
29b60 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
29b70 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
29b80 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
29b90 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29ba0 65 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20  e] = pCur->ix;. 
29bb0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29bc0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75  ur->iPage] = pCu
29bd0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72  r->pPage;.  pCur
29be0 2d 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72  ->ix = 0;.  pCur
29bf0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74  ->iPage++;.  ret
29c00 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61  urn getAndInitPa
29c10 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
29c20 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70   &pCur->pPage, p
29c30 43 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61  Cur, pCur->curPa
29c40 67 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69  gerFlags);.}..#i
29c50 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
29c60 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61  G./*.** Page pPa
29c70 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72  rent is an inter
29c80 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74  nal (non-leaf) t
29c90 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66  ree page. This f
29ca0 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65  unction .** asse
29cb0 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75  rts that page nu
29cc0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
29cd0 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66  he left-child if
29ce0 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20   the iIdx'th.** 
29cf0 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61  cell in page pPa
29d00 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64  rent. Or, if iId
29d10 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68  x is equal to th
29d20 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
29d30 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50  f.** cells in pP
29d40 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65  arent, that page
29d50 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
29d60 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
29d70 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65  d of.** the page
29d80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29d90 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
29da0 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  ex(MemPage *pPar
29db0 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50  ent, int iIdx, P
29dc0 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69  gno iChild){.  i
29dd0 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
29de0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
29df0 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65  conditions teste
29e00 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f  d below might no
29e10 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20  t be true.      
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f        ** in a co
29e40 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a  rrupt database *
29e50 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  /.  assert( iIdx
29e60 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
29e70 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
29e80 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
29e90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
29ea0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
29eb0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
29ec0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
29ed0 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
29ee0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
29ef0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
29f00 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
29f10 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
29f20 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
29f30 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
29f40 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
29f50 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
29f60 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
29f70 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
29f80 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
29f90 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
29fa0 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
29fb0 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
29fc0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
29fd0 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
29fe0 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
29ff0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
2a000 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
2a010 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
2a020 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
2a030 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
2a040 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
2a050 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  cell index..*/.s
2a060 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54  tatic void moveT
2a070 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72  oParent(BtCursor
2a080 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2a090 67 65 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73  ge *pLeaf;.  ass
2a0a0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2a0b0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2a0c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a0d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a0e0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
2a0f0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
2a100 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a110 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
2a120 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2a130 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
2a140 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2a150 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
2a160 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2a170 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70  1], .    pCur->p
2a180 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a  Page->pgno.  );.
2a190 20 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72    testcase( pCur
2a1a0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a1b0 61 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61  age-1] > pCur->a
2a1c0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a1d0 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  e-1]->nCell );. 
2a1e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2a1f0 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2a200 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2a210 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
2a220 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70  _ValidOvfl);.  p
2a230 43 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e  Cur->ix = pCur->
2a240 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a250 65 2d 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20  e-1];.  pLeaf = 
2a260 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70  pCur->pPage;.  p
2a270 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75  Cur->pPage = pCu
2a280 72 2d 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72  r->apPage[--pCur
2a290 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65  ->iPage];.  rele
2a2a0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
2a2b0 4c 65 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Leaf);.}../*.** 
2a2c0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a2d0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
2a2e0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73  root page of its
2a2f0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
2a300 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
2a310 74 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74  table has a virt
2a320 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74  ual root page, t
2a330 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
2a340 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74  s moved to point
2a350 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75  .** to the virtu
2a360 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73  al root page ins
2a370 74 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75  tead of the actu
2a380 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20  al root page. A 
2a390 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76  table has a.** v
2a3a0 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2a3b0 20 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   when the actual
2a3c0 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61   root page conta
2a3d0 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64  ins no cells and
2a3e0 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68   a .** single ch
2a3f0 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63  ild page. This c
2a400 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77  an only happen w
2a410 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f  ith the table ro
2a420 6f 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a  oted at page 1..
2a430 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74  **.** If the b-t
2a440 72 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73  ree structure is
2a450 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73   empty, the curs
2a460 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2a470 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e  to .** CURSOR_IN
2a480 56 41 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72  VALID and this r
2a490 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
2a4a0 51 4c 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68  QLITE_EMPTY. Oth
2a4b0 65 72 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63  erwise,.** the c
2a4c0 75 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20  ursor is set to 
2a4d0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72  point to the fir
2a4e0 73 74 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  st cell located 
2a4f0 6f 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28  on the root.** (
2a500 6f 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29  or virtual root)
2a510 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75   page and the cu
2a520 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
2a530 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
2a540 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
2a550 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2a560 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
2a570 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
2a580 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
2a590 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
2a5a0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
2a5b0 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
2a5c0 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
2a5d0 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
2a5e0 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
2a5f0 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
2a600 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
2a610 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
2a620 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
2a630 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
2a640 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
2a650 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
2a660 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
2a670 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
2a680 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
2a690 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
2a6a0 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
2a6b0 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
2a6c0 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
2a6d0 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
2a6e0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
2a6f0 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
2a700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a710 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
2a720 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
2a730 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
2a740 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a750 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
2a760 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2a770 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2a780 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
2a790 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
2a7a0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2a7b0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
2a7c0 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
2a7d0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
2a7e0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
2a7f0 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
2a800 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
2a810 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a820 74 61 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45  tate < CURSOR_RE
2a830 51 55 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75  QUIRESEEK || pCu
2a840 72 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20  r->iPage<0 );.  
2a850 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2a860 6e 6f 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72  noRoot>0 || pCur
2a870 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20  ->iPage<0 );..  
2a880 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
2a890 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  =0 ){.    if( pC
2a8a0 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
2a8b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
2a8c0 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  tNull(pCur->pPag
2a8d0 65 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  e);.      while(
2a8e0 20 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29   --pCur->iPage )
2a8f0 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
2a900 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
2a910 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a920 69 50 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d  iPage]);.      }
2a930 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61  .      pCur->pPa
2a940 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2a950 65 5b 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  e[0];.      goto
2a960 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20   skip_init;.    
2a970 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
2a980 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2a990 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
2a9a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2a9b0 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
2a9c0 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20   SQLITE_EMPTY;. 
2a9d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2a9e0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
2a9f0 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28  =(-1) );.    if(
2aa00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
2aa10 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2aa20 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  K ){.      if( p
2aa30 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2aa40 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2aa50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2aa60 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
2aa70 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
2aa80 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2aa90 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  kipNext;.      }
2aaa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
2aab0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
2aac0 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Cur);.    }.    
2aad0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
2aae0 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
2aaf0 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
2ab00 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50  oRoot, &pCur->pP
2ab10 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  age,.           
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
2ab30 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
2ab40 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
2ab50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ab60 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2ab70 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2ab80 49 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ID;.      return
2ab90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   rc;.    }.    p
2aba0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
2abb0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74      pCur->curInt
2abc0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  Key = pCur->pPag
2abd0 65 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20  e->intKey;.  }. 
2abe0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70   pRoot = pCur->p
2abf0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
2ac00 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
2ac10 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a  r->pgnoRoot );..
2ac20 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b    /* If pCur->pK
2ac30 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55  eyInfo is not NU
2ac40 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  LL, then the cal
2ac50 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20  ler that opened 
2ac60 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a  this cursor.  **
2ac70 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65   expected to ope
2ac80 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78  n it on an index
2ac90 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69   b-tree. Otherwi
2aca0 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20  se, if pKeyInfo 
2acb0 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68  is.  ** NULL, th
2acc0 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73  e caller expects
2acd0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e   a table b-tree.
2ace0 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
2acf0 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72  the case,.  ** r
2ad00 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
2ad10 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a  CORRUPT error. .
2ad20 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65    **.  ** Earlie
2ad30 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
2ad40 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61  Lite assumed tha
2ad50 74 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c  t this test coul
2ad60 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20  d not fail.  ** 
2ad70 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  if the root page
2ad80 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61   was already loa
2ad90 64 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  ded when this fu
2ada0 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65  nction was calle
2adb0 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20  d (i.e..  ** if 
2adc0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e  pCur->iPage>=0).
2add0 20 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74   But this is not
2ade0 20 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62   so if the datab
2adf0 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ase is corrupted
2ae00 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61   .  ** in such a
2ae10 20 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70   way that page p
2ae20 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69  Root is linked i
2ae30 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74  nto a second b-t
2ae40 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20  ree table .  ** 
2ae50 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74  (or the freelist
2ae60 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
2ae70 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
2ae80 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  1 || pRoot->intK
2ae90 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ey==0 );.  if( p
2aea0 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Root->isInit==0 
2aeb0 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  || (pCur->pKeyIn
2aec0 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69  fo==0)!=pRoot->i
2aed0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74  ntKey ){.    ret
2aee0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2aef0 50 54 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50  PT_PAGE(pCur->pP
2af00 61 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f  age);.  }..skip_
2af10 69 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e  init:  .  pCur->
2af20 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ix = 0;.  pCur->
2af30 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2af40 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2af50 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
2af60 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
2af70 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2af80 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75  ;..  pRoot = pCu
2af90 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
2afa0 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
2afb0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2afc0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2afd0 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
2afe0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
2aff0 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
2b000 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
2b010 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
2b020 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b030 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
2b040 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
2b050 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
2b060 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2b070 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2b080 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2b090 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2b0a0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
2b0b0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
2b0c0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2b0d0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2b0e0 44 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  D;.    rc = SQLI
2b0f0 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20  TE_EMPTY;.  }.  
2b100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b110 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2b120 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2b130 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
2b140 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b150 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
2b160 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2b170 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
2b180 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
2b190 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
2b1a0 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
2b1b0 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
2b1c0 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
2b1d0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2b1e0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
2b1f0 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
2b200 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2b210 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2b220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2b230 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2b240 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2b250 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2b260 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2b270 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2b280 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
2b290 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
2b2a0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
2b2b0 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
2b2c0 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
2b2d0 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
2b2e0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
2b2f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
2b300 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2b310 43 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72  Cur->ix));.    r
2b320 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
2b330 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
2b340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b350 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2b360 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
2b370 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
2b380 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
2b390 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
2b3a0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
2b3b0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
2b3c0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
2b3d0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
2b3e0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2b3f0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
2b400 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
2b410 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
2b420 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
2b430 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
2b440 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
2b450 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
2b460 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
2b470 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
2b480 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
2b490 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
2b4a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2b4b0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
2b4c0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
2b4d0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
2b4e0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
2b4f0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
2b500 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
2b510 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
2b520 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
2b530 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
2b540 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
2b550 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2b560 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2b570 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2b580 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2b590 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2b5a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2b5b0 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
2b5c0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
2b5d0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
2b5e0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
2b5f0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2b600 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2b610 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d  ;.    pCur->ix =
2b620 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
2b630 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2b640 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
2b650 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2b660 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
2b670 43 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d  Cur->ix = pPage-
2b680 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
2b690 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2b6a0 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
2b6b0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2b6c0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2b6d0 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
2b6e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2b6f0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
2b700 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
2b710 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2b720 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2b730 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
2b740 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
2b750 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
2b760 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
2b770 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
2b780 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
2b790 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
2b7a0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
2b7b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2b7c0 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
2b7d0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2b7e0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
2b7f0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2b800 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2b810 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2b820 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2b830 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
2b840 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
2b850 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2b860 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2b870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b880 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b890 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20  >pPage->nCell>0 
2b8a0 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
2b8b0 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2b8c0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2b8d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2b8e0 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b  =SQLITE_EMPTY ){
2b8f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2b900 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2b910 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  | pCur->pPage->n
2b920 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
2b930 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63  pRes = 1;.    rc
2b940 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b950 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b960 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2b970 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
2b980 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2b990 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2b9a0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2b9b0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2b9c0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2b9d0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2b9e0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2b9f0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2ba00 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2ba10 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2ba20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2ba30 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
2ba40 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2ba50 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
2ba60 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2ba70 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2ba80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2ba90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2baa0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2bab0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2bac0 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2bad0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
2bae0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2baf0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
2bb00 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
2bb10 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2bb20 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d  eState && (pCur-
2bb30 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2bb40 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23  _AtLast)!=0 ){.#
2bb50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2bb60 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
2bb70 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
2bb80 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
2bb90 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
2bba0 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
2bbb0 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
2bbc0 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
2bbd0 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
2bbe0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2bbf0 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
2bc00 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
2bc10 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2bc20 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
2bc30 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
2bc40 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2bc50 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75  t( pCur->ix==pCu
2bc60 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  r->pPage->nCell-
2bc70 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2bc80 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65   pCur->pPage->le
2bc90 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
2bca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2bcb0 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
2bcc0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2bcd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2bce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2bcf0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2bd00 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2bd10 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
2bd20 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2bd30 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2bd40 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2bd50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bd60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2bd70 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2bd80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bd90 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2bda0 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
2bdb0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2bdc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
2bdd0 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  TY ){.    assert
2bde0 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2bdf0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  ==0 || pCur->pPa
2be00 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2be10 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2be20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2be30 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2be40 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2be50 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2be60 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2be70 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2be80 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2be90 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2bea0 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2beb0 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2bec0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2bed0 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2bee0 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2bef0 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2bf00 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2bf10 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2bf20 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2bf30 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2bf40 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2bf50 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2bf60 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2bf70 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2bf80 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2bf90 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2bfa0 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2bfb0 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2bfc0 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2bfd0 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2bfe0 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2bff0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2c000 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2c010 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2c020 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2c030 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2c040 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2c050 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2c060 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2c070 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2c080 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2c090 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2c0a0 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2c0b0 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2c0c0 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2c0d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2c0e0 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2c0f0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2c100 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2c110 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2c120 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2c130 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2c150 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2c160 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2c170 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2c180 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2c190 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2c1a0 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2c1b0 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2c1c0 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2c1d0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2c1e0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2c1f0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2c200 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2c210 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2c220 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2c230 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2c240 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2c250 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2c260 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2c270 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2c280 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2c290 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2c2a0 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2c2b0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2c2c0 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2c2d0 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2c2e0 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2c2f0 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2c300 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2c310 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2c320 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2c330 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2c340 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2c350 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2c360 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2c370 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2c380 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2c390 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2c3a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2c3b0 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2c3c0 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2c3d0 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c3f0 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2c400 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2c410 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2c420 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2c430 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2c440 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2c450 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2c460 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2c470 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2c480 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2c490 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2c4a0 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2c4b0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2c4c0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2c4d0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2c4e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c4f0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2c500 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2c510 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2c520 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2c530 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2c540 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2c550 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2c560 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2c570 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64  OR_VALID || (pId
2c580 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2c590 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29  >curIntKey!=0) )
2c5a0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2c5b0 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2c5c0 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2c5d0 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2c5e0 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2c5f0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2c600 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2c610 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2c620 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  */.  if( pIdxKey
2c630 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ==0.   && pCur->
2c640 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c650 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
2c660 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2c670 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29  alidNKey)!=0.  )
2c680 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2c690 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2c6a0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2c6b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2c6c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c6d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2c6e0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2c6f0 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
2c700 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2c710 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2c720 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2c730 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  es = -1;.       
2c740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c750 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2c760 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
2c770 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20  sted key is one 
2c780 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72  more than the pr
2c790 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e  evious key, then
2c7a0 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f  .      ** try to
2c7b0 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67   get there using
2c7c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2c7d0 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  t() rather than 
2c7e0 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a full.      ** 
2c7f0 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
2c800 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2c810 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54  ization only.  T
2c820 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2c830 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  r.      ** is st
2c840 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74  ill obtained wit
2c850 68 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20  hout this case, 
2c860 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f  only a little mo
2c870 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20  re slowely */.  
2c880 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2c890 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65  fo.nKey+1==intKe
2c8a0 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70  y && !pCur->skip
2c8b0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
2c8c0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2c8d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2c8e0 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
2c8f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2c900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c910 20 20 20 20 20 20 20 20 20 20 67 65 74 43 65 6c            getCel
2c920 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
2c930 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
2c940 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2c950 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2c960 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c970 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2c980 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2c990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
2c9a0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
2c9b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2c9c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c9d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2c9e0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2c9f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2ca00 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
2ca10 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2ca20 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
2ca30 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
2ca40 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
2ca50 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
2ca60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2ca70 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2ca80 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
2ca90 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2caa0 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
2cab0 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2cac0 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
2cad0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2cae0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2caf0 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
2cb00 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
2cb10 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2cb20 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2cb30 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
2cb40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2cb50 50 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73  PTY ){.      ass
2cb60 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2cb70 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2cb80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2cb90 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2cba0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
2cbb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2cbc0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
2cbd0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2cbe0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
2cbf0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2cc00 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2cc10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cc20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2cc30 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2cc40 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
2cc50 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73  Cell > 0 );.  as
2cc60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2cc70 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  e==0 || pCur->ap
2cc80 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
2cc90 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
2cca0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ccb0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c  ur->curIntKey ||
2ccc0 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
2ccd0 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
2cce0 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
2ccf0 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
2cd00 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2cd10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2cd20 67 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  ge;.    u8 *pCel
2cd30 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2cd50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2cd60 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2cd70 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2cd80 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2cd90 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2cda0 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2cdb0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2cdc0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2cdd0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2cde0 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2cdf0 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2ce00 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2ce10 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2ce20 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2ce30 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2ce40 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2ce50 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2ce60 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2ce70 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2ce80 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2ce90 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2cea0 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2ceb0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2cec0 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2ced0 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2cee0 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2cef0 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2cf00 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2cf10 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2cf20 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2cf30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2cf40 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2cf50 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2cf60 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2cf70 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2cf80 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2cf90 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2cfa0 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2cfb0 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2cfc0 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2cfd0 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2cfe0 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2cff0 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2d000 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2d010 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2d020 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2d030 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2d040 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2d050 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2d060 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2d070 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2d080 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2d090 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2d0a0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2d0b0 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2d0c0 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2d0d0 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2d0e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d0f0 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2d100 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ataEnd ){.      
2d110 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d120 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2d130 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
2d140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d150 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d160 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2d170 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2d180 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2d190 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2d1a0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2d1b0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2d1c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2d1d0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2d1e0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2d1f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2d200 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2d210 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2d220 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2d230 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2d240 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2d250 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2d260 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2d270 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2d280 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2d290 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2d2a0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2d2b0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2d2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
2d2d0 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
2d2e0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2d2f0 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
2d300 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d310 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2d320 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2d330 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2d340 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2d350 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2d360 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2d370 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2d380 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2d390 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2d3a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2d3b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d3d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2d3e0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2d3f0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2d400 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2d410 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2d420 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2d430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2d440 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2d450 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2d460 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2d470 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2d480 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2d490 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2d4a0 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2d4b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2d4c0 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2d4d0 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2d4e0 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2d4f0 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2d500 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2d510 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2d520 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2d530 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2d540 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2d550 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2d560 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2d570 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2d580 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2d590 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2d5a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2d5b0 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2d5c0 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2d5d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2d5e0 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2d5f0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2d600 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2d610 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2d620 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2d630 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2d640 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2d650 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2d660 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2d670 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2d680 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2d690 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2d6a0 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2d6b0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2d6c0 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2d6d0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2d6e0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2d6f0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2d700 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2d710 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2d720 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2d730 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2d740 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2d750 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2d760 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2d770 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2d780 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2d790 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2d7a0 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2d7b0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2d7c0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2d7d0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2d7e0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2d7f0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2d800 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2d810 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2d820 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2d830 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2d840 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2d850 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2d860 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2d870 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2d880 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2d890 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2d8a0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2d8b0 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2d8c0 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2d8d0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2d8e0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2d8f0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2d900 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2d910 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2d920 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2d930 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2d940 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2d950 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2d960 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2d970 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2d980 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2d990 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2d9a0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2d9b0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2d9c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2d9d0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2d9e0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2d9f0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2da00 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2da10 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2da20 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2da30 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2da40 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2da50 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2da60 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2da70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2da80 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2da90 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2daa0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2dab0 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2dac0 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2dad0 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2dae0 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2daf0 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2db00 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2db10 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2db20 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2db30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2db40 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2db50 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2db60 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2db70 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2db80 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
2db90 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
2dba0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
2dbb0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
2dbc0 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
2dbd0 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
2dbe0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
2dbf0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
2dc00 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
2dc10 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
2dc20 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
2dc30 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
2dc40 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
2dc50 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
2dc60 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2dc70 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
2dc80 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
2dc90 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
2dca0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2dcb0 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
2dcc0 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2dcd0 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2dce0 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
2dcf0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2dd00 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
2dd10 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2dd20 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
2dd30 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2dd40 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
2dd50 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
2dd60 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
2dd70 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
2dd80 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20  f( nCell<2 ){.  
2dd90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2dda0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2ddb0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
2ddc0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2ddd0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2dde0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2ddf0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
2de00 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
2de10 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  +18 );.         
2de20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
2de30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2de40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2de50 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2de60 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2de70 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2de80 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2de90 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2dea0 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2deb0 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2dec0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2ded0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2dee0 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
2def0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2df00 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
2df10 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
2df20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2df30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2df40 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2df50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2df60 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2df70 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2df80 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2df90 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2dfa0 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2dfb0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2dfc0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2dfd0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2dfe0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2dff0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2e000 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2e010 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2e020 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2e030 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2e040 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2e050 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2e060 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2e070 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2e080 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2e090 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2e0a0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2e0b0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2e0c0 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2e0d0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2e0e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e0f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e100 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2e110 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2e120 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2e130 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2e140 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2e150 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2e160 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2e170 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2e180 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2e190 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2e1a0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2e1b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e1c0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
2e1d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2e1e0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2e1f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2e200 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2e210 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2e220 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
2e230 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2e240 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
2e250 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
2e260 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
2e270 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e280 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2e290 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2e2a0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
2e2b0 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2e2c0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2e2d0 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
2e2e0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2e2f0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
2e300 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2e310 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
2e320 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2e330 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
2e340 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
2e350 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
2e360 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
2e370 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
2e380 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2e390 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2e3a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e3b0 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2e3c0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2e3d0 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
2e3e0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20   }.    pCur->ix 
2e3f0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
2e400 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2e410 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
2e420 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2e430 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
2e440 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
2e450 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2e460 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2e470 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2e480 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2e490 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e4a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2e4b0 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2e4c0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2e4d0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2e4e0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2e4f0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2e500 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2e510 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2e520 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2e530 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2e540 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2e550 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2e560 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2e570 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2e580 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2e590 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2e5a0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2e5b0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2e5c0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2e5d0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2e5e0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2e5f0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2e600 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2e610 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2e620 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2e630 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2e640 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2e650 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2e660 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2e670 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2e680 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2e690 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2e6a0 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2e6b0 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2e6c0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2e6d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e6e0 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20  an estimate for 
2e6f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2e700 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2e710 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
2e720 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65  pointing to.  Re
2e730 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2e740 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74  number if no est
2e750 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e 74  imate is current
2e760 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ly .** available
2e770 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
2e780 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74  BtreeRowCountEst
2e790 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2e7a0 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20  {.  i64 n;.  u8 
2e7b0 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  i;..  assert( cu
2e7c0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2e7d0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2e7e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2e7f0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2e800 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2e810 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74  );..  /* Current
2e820 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61 63  ly this interfac
2e830 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
2e840 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61   by the OP_IfSma
2e850 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ller.  ** opcode
2e860 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63 61  , and it that ca
2e870 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 69  se the cursor wi
2e880 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c  ll always be val
2e890 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c  id and.  ** will
2e8a0 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f   always point to
2e8b0 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f   a leaf node. */
2e8c0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
2e8d0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e8e0 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75 72  R_VALID) ) retur
2e8f0 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45  n -1;.  if( NEVE
2e900 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  R(pCur->pPage->l
2e910 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  eaf==0) ) return
2e920 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72   -1;..  n = pCur
2e930 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  ->pPage->nCell;.
2e940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75    for(i=0; i<pCu
2e950 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
2e960 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61      n *= pCur->a
2e970 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b  pPage[i]->nCell;
2e980 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
2e990 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2e9a0 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2e9b0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2e9c0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2e9d0 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
2e9e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54  :.**.**    SQLIT
2e9f0 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63  E_OK        succ
2ea00 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  ess.**    SQLITE
2ea10 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f  _DONE      curso
2ea20 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
2ea30 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73  nting at the las
2ea40 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  t element.**    
2ea50 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20  otherwise       
2ea60 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
2ea70 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
2ea80 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2ea90 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2eaa0 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2eab0 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2eac0 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2ead0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2eae0 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2eaf0 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2eb00 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2eb10 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2eb20 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2eb30 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2eb40 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2eb50 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2eb60 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2eb70 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2eb80 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2eb90 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2eba0 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2ebb0 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2ebc0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69  sor..**.** If bi
2ebd0 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20  t 0x01 of the F 
2ebe0 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69  argument in sqli
2ebf0 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46  te3BtreeNext(C,F
2ec00 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65  ) is 1, then the
2ec10 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65  .** cursor corre
2ec20 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2ec30 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
2ec40 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2ec50 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
2ec60 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
2ec70 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
2ec80 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
2ec90 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  e F argument.** 
2eca0 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
2ecb0 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c   implement.  SQL
2ecc0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2ecd0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2ece0 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69  t use.** this hi
2ecf0 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
2ed00 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
2ed10 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2ed20 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
2ed30 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2ed40 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
2ed50 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
2ed60 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2ed70 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2ed80 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ed90 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2eda0 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2edb0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2edc0 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70  VALID );.  if( p
2edd0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2ede0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2edf0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2ee00 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2ee10 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2ee20 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2ee30 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2ee40 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2ee50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ee60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2ee70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2ee80 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2ee90 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2eea0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2eeb0 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
2eec0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2eed0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
2eee0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2eef0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2ef00 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2ef10 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2ef20 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
2ef30 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2ef40 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2ef50 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2ef60 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t>0 ){.        p
2ef70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2ef80 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2ef90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2efa0 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2efb0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2efc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
2efd0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2efe0 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
2eff0 3e 69 78 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >ix;.  assert( p
2f000 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2f010 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
2f020 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
2f030 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
2f040 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
2f050 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
2f060 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
2f070 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
2f080 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
2f090 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
2f0a0 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
2f0b0 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
2f0c0 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
2f0d0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
2f0e0 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
2f0f0 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
2f100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2f110 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
2f120 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
2f130 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
2f140 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
2f150 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
2f160 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
2f170 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
2f180 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
2f190 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
2f1a0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
2f1b0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2f1c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2f1d0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2f1e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2f1f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2f200 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
2f210 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2f220 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
2f230 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2f240 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
2f250 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2f260 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2f270 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2f280 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2f290 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
2f2a0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
2f2b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2f2c0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2f2d0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
2f2e0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2f2f0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
2f300 69 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ix>=pPage->nCell
2f310 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2f320 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
2f330 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2f340 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
2f350 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
2f360 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f370 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2f380 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
2f390 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
2f3a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2f3b0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2f3c0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2f3d0 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74  pCur);.  }.}.int
2f3e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2f3f0 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2f400 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2f410 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2f420 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2f430 45 52 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a  ER( flags );  /*
2f440 20 55 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20   Used in COMDB2 
2f450 62 75 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53  but not native S
2f460 51 4c 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72  QLite */.  asser
2f470 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2f480 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2f490 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
2f4a0 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b  0 || flags==1 );
2f4b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2f4c0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2f4d0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2f4e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2f4f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2f500 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2f510 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2f520 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2f530 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66  ValidOvfl);.  if
2f540 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2f550 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72  CURSOR_VALID ) r
2f560 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28  eturn btreeNext(
2f570 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d  pCur);.  pPage =
2f580 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2f590 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29  if( (++pCur->ix)
2f5a0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2f5b0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d  {.    pCur->ix--
2f5c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
2f5d0 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
2f5e0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c  }.  if( pPage->l
2f5f0 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eaf ){.    retur
2f600 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2f610 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2f620 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2f630 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pCur);.  }.}../*
2f640 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
2f650 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
2f660 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
2f670 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
2f680 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e  abase..** Return
2f690 20 76 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   values:.**.**  
2f6a0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
2f6b0 20 73 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 20   success.**     
2f6c0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74 68  SQLITE_DONE   th
2f6d0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
2f6e0 61 64 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74  ady on the first
2f6f0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
2f700 74 61 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68  table.**     oth
2f710 65 72 77 69 73 65 20 20 20 20 20 73 6f 6d 65 20  erwise     some 
2f720 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63  kind of error oc
2f730 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65  curred.**.** The
2f740 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2f750 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2f760 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
2f770 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2f780 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2f790 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2f7a0 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
2f7b0 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2f7c0 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2f7d0 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2f7e0 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
2f7f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2f800 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2f810 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
2f820 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
2f830 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2f840 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2f850 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2f860 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
2f870 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
2f880 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2f890 20 49 66 20 62 69 74 20 30 78 30 31 20 6f 66 20   If bit 0x01 of 
2f8a0 74 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 74  the F argument t
2f8b0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  o sqlite3BtreePr
2f8c0 65 76 69 6f 75 73 28 43 2c 46 29 20 69 73 20 31  evious(C,F) is 1
2f8d0 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75  , then.** the cu
2f8e0 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  rsor corresponds
2f8f0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
2f900 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
2f910 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65  e could have bee
2f920 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20  n.** skipped if 
2f930 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61  the SQL index ha
2f940 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20  d been a unique 
2f950 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61 72  index.  The F ar
2f960 67 75 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68  gument is a.** h
2f970 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65  int to the imple
2f980 6d 65 6e 74 2e 20 20 54 68 65 20 6e 61 74 69 76  ment.  The nativ
2f990 65 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  e SQLite btree i
2f9a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2f9b0 65 73 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68  es not.** use th
2f9c0 69 73 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d  is hint, but COM
2f9d0 44 42 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61  DB2 does..*/.sta
2f9e0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
2f9f0 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65  INE int btreePre
2fa00 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2fa10 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
2fa20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2fa30 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2fa40 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2fa50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2fa60 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2fa70 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2fa80 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2fa90 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2faa0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2fab0 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
2fac0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2fad0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
2fae0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2faf0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2fb00 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
2fb10 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2fb20 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
2fb30 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2fb40 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2fb50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2fb60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fb70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2fb80 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2fb90 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2fba0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72  State ){.      r
2fbb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
2fbc0 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  E;.    }.    if(
2fbd0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2fbe0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2fbf0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2fc00 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2fc10 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2fc20 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2fc30 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2fc40 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2fc50 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2fc60 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2fc70 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2fc80 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2fc90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2fca0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2fcb0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2fcc0 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2fcd0 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2fce0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73  ur->pPage;.  ass
2fcf0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2fd00 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
2fd10 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2fd20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
2fd30 69 78 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ix;.    rc = mov
2fd40 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2fd50 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2fd60 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
2fd70 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2fd80 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2fd90 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2fda0 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2fdb0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
2fdc0 2d 3e 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->ix==0 ){.     
2fdd0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2fde0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2fdf0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2fe00 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2fe10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fe20 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20  ITE_DONE;.      
2fe30 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2fe40 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2fe50 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2fe60 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
2fe70 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2fe80 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2fe90 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76   & (BTCF_ValidOv
2fea0 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
2feb0 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20  pCur->ix--;.    
2fec0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2fed0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61  age;.    if( pPa
2fee0 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2fef0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2ff00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2ff10 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
2ff20 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ur, 0);.    }els
2ff30 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2ff40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2ff50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ff60 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2ff70 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2ff80 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66  sor *pCur, int f
2ff90 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28  lags){.  assert(
2ffa0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2ffb0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2ffc0 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
2ffd0 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20  || flags==1 );. 
2ffe0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2fff0 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
30000 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
30010 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55 4e  OR_VALID );.  UN
30020 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
30030 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65  flags );  /* Use
30040 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20  d in COMDB2 but 
30050 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74  not native SQLit
30060 65 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72  e */.  pCur->cur
30070 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
30080 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
30090 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
300a0 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69  NKey);.  pCur->i
300b0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
300c0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
300d0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a  e!=CURSOR_VALID.
300e0 20 20 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d     || pCur->ix==
300f0 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50  0.   || pCur->pP
30100 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29  age->leaf==0.  )
30110 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  {.    return btr
30120 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 29  eePrevious(pCur)
30130 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78  ;.  }.  pCur->ix
30140 2d 2d 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  --;.  return SQL
30150 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
30160 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
30170 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
30180 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
30190 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
301a0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
301b0 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
301c0 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
301d0 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
301e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
301f0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
30200 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
30210 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
30220 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
30230 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
30240 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
30250 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
30260 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
30270 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
30280 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
30290 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
302a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
302b0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
302c0 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
302d0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
302e0 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
302f0 72 2e 20 20 2a 70 70 50 61 67 65 20 69 73 20 73  r.  *ppPage is s
30300 65 74 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68  et to NULL in th
30310 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72  e event of an er
30320 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
30330 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d  e "nearby" param
30340 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74  eter is not 0, t
30350 68 65 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73  hen an effort is
30360 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63   made to .** loc
30370 61 74 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65  ate a page close
30380 20 74 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d   to the page num
30390 62 65 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54  ber "nearby".  T
303a0 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
303b0 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  in an.** attempt
303c0 20 74 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64   to keep related
303d0 20 70 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20   pages close to 
303e0 65 61 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68  each other in th
303f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
30400 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72  .** which in tur
30410 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62  n can make datab
30420 61 73 65 20 61 63 63 65 73 73 20 66 61 73 74 65  ase access faste
30430 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
30440 65 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20  eMode parameter 
30450 69 73 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  is BTALLOC_EXACT
30460 20 61 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20   and the nearby 
30470 70 61 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61  page exists.** a
30480 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  nywhere on the f
30490 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69  ree-list, then i
304a0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
304b0 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  to be returned. 
304c0 20 49 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20   If.** eMode is 
304d0 42 54 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20  BTALLOC_LT then 
304e0 74 68 65 20 70 61 67 65 20 72 65 74 75 72 6e 65  the page returne
304f0 64 20 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74  d will be less t
30500 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
30510 74 6f 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79  to nearby if any
30520 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
30530 73 2e 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20  s.  If eMode is 
30540 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e  BTALLOC_ANY then
30550 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
30560 20 72 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e   restrictions on
30570 20 77 68 69 63 68 20 70 61 67 65 20 69 73 20 72   which page is r
30580 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
30590 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
305a0 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
305b0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
305c0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
305d0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
305e0 70 50 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53  pPage,      /* S
305f0 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  tore pointer to 
30600 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  the allocated pa
30610 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e  ge here */.  Pgn
30620 6f 20 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20  o *pPgno,       
30630 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65      /* Store the
30640 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72   page number her
30650 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72  e */.  Pgno near
30660 62 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  by,           /*
30670 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 70 61   Search for a pa
30680 67 65 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65  ge near this one
30690 20 2a 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20   */.  u8 eMode  
306a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
306b0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42  BTALLOC_EXACT, B
306c0 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54  TALLOC_LT, or BT
306d0 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a  ALLOC_ANY */.){.
306e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
306f0 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  1;.  int rc;.  u
30700 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 n;     /* Num
30710 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20  ber of pages on 
30720 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
30730 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20    u32 k;     /* 
30740 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73  Number of leaves
30750 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66   on the trunk of
30760 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
30770 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75  .  MemPage *pTru
30780 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  nk = 0;.  MemPag
30790 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20  e *pPrevTrunk = 
307a0 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65  0;.  Pgno mxPage
307b0 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73  ;     /* Total s
307c0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
307d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  ase file */..  a
307e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
307f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
30800 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
30810 74 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  t( eMode==BTALLO
30820 43 5f 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79  C_ANY || (nearby
30830 3e 30 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41  >0 && IfNotOmitA
30840 56 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  V(pBt->autoVacuu
30850 6d 29 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20  m)) );.  pPage1 
30860 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
30870 20 6d 78 50 61 67 65 20 3d 20 62 74 72 65 65 50   mxPage = btreeP
30880 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
30890 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
308a0 20 52 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54   R-05119-02637 T
308b0 68 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  he 4-byte big-en
308c0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20  dian integer at 
308d0 6f 66 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73  offset 36.  ** s
308e0 74 6f 72 65 73 20 73 74 6f 72 65 73 20 74 68 65  tores stores the
308f0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
30900 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
30910 65 65 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d  eelist. */.  n =
30920 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
30930 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
30940 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78   testcase( n==mx
30950 50 61 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20  Page-1 );.  if( 
30960 6e 3e 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  n>=mxPage ){.   
30970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
30980 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
30990 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
309a0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70    /* There are p
309b0 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
309c0 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65  list.  Reuse one
309d0 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e   of those pages.
309e0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72   */.    Pgno iTr
309f0 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72  unk;.    u8 sear
30a00 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49  chList = 0; /* I
30a10 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  f the free-list 
30a20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65 64  must be searched
30a30 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f   for 'nearby' */
30a40 0a 20 20 20 20 75 33 32 20 6e 53 65 61 72 63 68  .    u32 nSearch
30a50 20 3d 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74   = 0;   /* Count
30a60 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
30a70 66 20 73 65 61 72 63 68 20 61 74 74 65 6d 70 74  f search attempt
30a80 73 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  s */.    .    /*
30a90 20 49 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c   If eMode==BTALL
30aa0 4f 43 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71  OC_EXACT and a q
30ab0 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
30ac0 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
30ad0 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
30ae0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
30af0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
30b00 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
30b10 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
30b20 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
30b30 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
30b40 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
30b50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30b60 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30b70 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c   if( eMode==BTAL
30b80 4c 4f 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20  LOC_EXACT ){.   
30b90 20 20 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d     if( nearby<=m
30ba0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  xPage ){.       
30bb0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20   u8 eType;.     
30bc0 20 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62     assert( nearb
30bd0 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  y>0 );.        a
30be0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
30bf0 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
30c00 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
30c10 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
30c20 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
30c30 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30c40 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66  n rc;.        if
30c50 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
30c60 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
30c70 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
30c80 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
30c90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
30ca0 65 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41  e if( eMode==BTA
30cb0 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
30cc0 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
30cd0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
30ce0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
30cf0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f  the free-list co
30d00 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69 54  unt by 1. Set iT
30d10 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65  runk to the inde
30d20 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  x of the.    ** 
30d30 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20  first free-list 
30d40 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65  trunk page. iPre
30d50 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61  vTrunk is initia
30d60 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20  lly 1..    */.  
30d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30d80 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
30d90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
30da0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
30db0 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  c;.    put4byte(
30dc0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
30dd0 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f  6], n-1);..    /
30de0 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68 69  * The code withi
30df0 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72  n this loop is r
30e00 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20  un only once if 
30e10 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74 27  the 'searchList'
30e20 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a   variable.    **
30e30 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74   is not true. Ot
30e40 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73  herwise, it runs
30e50 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74   once for each t
30e60 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65  runk-page on the
30e70 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73  .    ** free-lis
30e80 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65  t until the page
30e90 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
30ea0 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
30eb0 4c 4c 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20  LLOC_EXACT).    
30ec0 2a 2a 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61  ** or until a pa
30ed0 67 65 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65  ge less than 'ne
30ee0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
30ef0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
30f00 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20  _LT).    */.    
30f10 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76  do {.      pPrev
30f20 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a  Trunk = pTrunk;.
30f30 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54        if( pPrevT
30f40 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
30f50 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
30f60 52 2d 30 31 35 30 36 2d 31 31 30 35 33 20 54 68  R-01506-11053 Th
30f70 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 20  e first integer 
30f80 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
30f90 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20  unk page.       
30fa0 20 2a 2a 20 69 73 20 74 68 65 20 70 61 67 65 20   ** is the page 
30fb0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
30fc0 78 74 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  xt freelist trun
30fd0 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  k page in the li
30fe0 73 74 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  st or.        **
30ff0 20 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73   zero if this is
31000 20 74 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69   the last freeli
31010 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a  st trunk page. *
31020 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
31030 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
31040 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
31050 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
31060 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
31070 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31  ENCE-OF: R-59841
31080 2d 31 33 37 39 38 20 54 68 65 20 34 2d 62 79 74  -13798 The 4-byt
31090 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
310a0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33  eger at offset 3
310b0 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  2.        ** sto
310c0 72 65 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d  res the page num
310d0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
310e0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 72 65   page of the fre
310f0 65 6c 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69  elist, or zero i
31100 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
31110 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
31120 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  ty. */.        i
31130 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
31140 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
31150 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  32]);.      }.  
31160 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
31170 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  runk==mxPage );.
31180 20 20 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b        if( iTrunk
31190 3e 6d 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72  >mxPage || nSear
311a0 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20  ch++ > n ){.    
311b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
311c0 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72  CORRUPT_PGNO(pPr
311d0 65 76 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54  evTrunk ? pPrevT
311e0 72 75 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b  runk->pgno : 1);
311f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31200 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
31210 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
31220 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
31230 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nk, 0);.      }.
31240 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
31250 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d          pTrunk =
31260 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
31270 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31280 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ge;.      }.    
31290 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b    assert( pTrunk
312a0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
312b0 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ert( pTrunk->aDa
312c0 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f  ta!=0 );.      /
312d0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
312e0 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68 65  -13523-04394 The
312f0 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20   second integer 
31300 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74 72  on a freelist tr
31310 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a  unk page.      *
31320 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
31330 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69  of leaf page poi
31340 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e  nters to follow.
31350 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65   */.      k = ge
31360 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
31370 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
31380 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65   if( k==0 && !se
31390 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20  archList ){.    
313a0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
313b0 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61   has no leaves a
313c0 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e  nd the list is n
313d0 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  ot being searche
313e0 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  d. .        ** S
313f0 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74 72  o extract the tr
31400 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20  unk page itself 
31410 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74 68  and use it as th
31420 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20  e newly .       
31430 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61   ** allocated pa
31440 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73  ge */.        as
31450 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b  sert( pPrevTrunk
31460 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
31470 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
31480 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
31490 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
314a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
314b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
314c0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
314d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70      }.        *p
314e0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
314f0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
31500 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
31510 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
31520 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
31530 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e   *ppPage = pTrun
31540 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  k;.        pTrun
31550 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
31560 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
31570 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
31580 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
31590 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
315a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
315b0 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75  ( k>(u32)(pBt->u
315c0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29  sableSize/4 - 2)
315d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56   ){.        /* V
315e0 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74  alue of k is out
315f0 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61   of range.  Data
31600 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
31610 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  */.        rc = 
31620 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
31630 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
31640 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
31650 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
31660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31670 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31680 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
31690 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
316a0 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d      && (nearby==
316b0 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e  iTrunk || (iTrun
316c0 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  k<nearby && eMod
316d0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
316e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
316f0 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
31700 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
31710 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
31720 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
31730 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
31740 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
31750 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
31760 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
31770 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
31780 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
31790 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
317a0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
317b0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
317c0 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
317d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
317e0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
317f0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
31800 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
31810 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31820 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
31830 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
31840 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31850 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
31860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
31870 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
31880 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
31890 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
318a0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
318b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
318c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
318d0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
318e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
318f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31910 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
31920 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
31930 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
31940 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
31950 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
31960 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
31970 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
31980 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
31990 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
319a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
319b0 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
319c0 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
319d0 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
319e0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
319f0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
31a00 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
31a10 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
31a20 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
31a30 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
31a40 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
31a50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
31a60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
31a70 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
31a80 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
31a90 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
31aa0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
31ab0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
31ac0 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
31ad0 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
31ae0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
31af0 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b  PT_PGNO(iTrunk);
31b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
31b10 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
31b20 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
31b30 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
31b40 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d  ase( iNewTrunk==
31b50 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20  mxPage );.      
31b60 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
31b70 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
31b80 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65   iNewTrunk, &pNe
31b90 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  wTrunk, 0);.    
31ba0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
31bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
31bc0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
31bd0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
31be0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31bf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
31c00 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
31c10 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
31c20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
31c30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31c40 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
31c50 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
31c60 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  k);.            
31c70 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31c80 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
31c90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65    }.          me
31ca0 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
31cb0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
31cc0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
31cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  ;.          put4
31ce0 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d  byte(&pNewTrunk-
31cf0 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  >aData[4], k-1);
31d00 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
31d10 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
31d20 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[8], &pTrunk-
31d30 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31  >aData[12], (k-1
31d40 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  )*4);.          
31d50 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
31d60 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
31d70 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
31d80 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
31d90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
31da0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
31db0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
31dc0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
31dd0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
31de0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e  1->aData[32], iN
31df0 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
31e00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31e10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
31e20 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31e30 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
31e40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
31e50 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
31e60 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31e70 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
31e80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
31e90 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
31ea0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
31eb0 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72  aData[0], iNewTr
31ec0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
31ed0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31ee0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
31ef0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
31f00 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
31f10 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
31f20 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
31f30 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69  no, n-1));.#endi
31f40 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  f.      }else if
31f50 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
31f60 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65   /* Extract a le
31f70 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e  af from the trun
31f80 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  k */.        u32
31f90 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20   closest;.      
31fa0 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20    Pgno iPage;.  
31fb0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63        unsigned c
31fc0 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72  har *aData = pTr
31fd0 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  unk->aData;.    
31fe0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
31ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
32000 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63  2 i;.          c
32010 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
32020 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d        if( eMode=
32030 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
32040 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
32050 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20  =0; i<k; i++){. 
32060 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 61               iPa
32070 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
32080 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20  Data[8+i*4]);.  
32090 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
320a0 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b  iPage<=nearby ){
320b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
320c0 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
320d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
320e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
320f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
32100 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
32110 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
32120 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20  int dist;.      
32130 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c        dist = sql
32140 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
32150 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29  4byte(&aData[8])
32160 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20   - nearby);.    
32170 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
32180 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
32190 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 32            int d2
321a0 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74   = sqlite3AbsInt
321b0 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44 61  32(get4byte(&aDa
321c0 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61  ta[8+i*4]) - nea
321d0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
321e0 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
321f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32200 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32220 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
32230 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32240 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
32260 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
32270 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
32280 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
32290 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
322a0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
322b0 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  4]);.        tes
322c0 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
322d0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
322e0 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
322f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
32300 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
32310 54 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a  T_PGNO(iTrunk);.
32320 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
32330 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
32340 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32350 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
32360 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
32370 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
32380 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
32390 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
323a0 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
323b0 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
323c0 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
323d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
323e0 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
323f0 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
32400 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
32410 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
32420 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
32430 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
32440 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
32450 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
32460 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
32470 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
32480 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
32490 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
324a0 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
324b0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
324c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
324d0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
324e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
324f0 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
32500 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32510 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
32520 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
32530 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
32540 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
32550 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
32560 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
32570 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
32580 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
32590 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
325a0 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
325b0 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
325c0 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47  Bt, *pPgno)? PAG
325d0 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
325e0 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
325f0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
32600 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
32610 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
32620 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
32630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
32640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32650 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32660 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
32670 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
32680 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32690 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
326a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
326b0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
326c0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
326d0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
326e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
326f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32700 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
32710 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
32720 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
32730 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
32740 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
32750 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
32760 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
32770 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
32780 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
32790 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
327a0 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65  reelist, so appe
327b0 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  nd a new page to
327c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
327d0 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
327e0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c  **.    ** Normal
327f0 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c  ly, new pages al
32800 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
32810 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71  block can be req
32820 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  uested from the.
32830 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79      ** pager lay
32840 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
32850 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
32860 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  t. This prevents
32870 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
32880 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
32890 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20   read the pages 
328a0 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
328b0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
328c0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
328d0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  t transaction ha
328e0 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e  s already run on
328f0 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d  e or more increm
32900 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20  ental-vacuum.   
32910 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20   ** steps, then 
32920 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
32930 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74  about to allocat
32940 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f  e may contain co
32950 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  ntent.    ** tha
32960 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  t is required in
32970 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
32980 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  rollback. In thi
32990 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a  s case, do.    *
329a0 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f  * not set the no
329b0 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54  -content flag. T
329c0 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70  his causes the p
329d0 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64  ager to load and
329e0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
329f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
32a00 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20   content before 
32a10 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a  overwriting it..
32a20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
32a30 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
32a40 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  r will not actua
32a50 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  lly attempt to l
32a60 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a  oad or journal .
32a70 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
32a80 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  or any page that
32a90 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65   really does lie
32aa0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
32ab0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
32ac0 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73    ** file on dis
32ad0 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74  k. So the effect
32ae0 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74  s of disabling t
32af0 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70  he no-content op
32b00 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
32b10 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69  * here are confi
32b20 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67  ned to those pag
32b30 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77  es that lie betw
32b40 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
32b50 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
32b60 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65  se image and the
32b70 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
32b80 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
32b90 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e  /.    int bNoCon
32ba0 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74  tent = (0==IfNot
32bb0 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
32bc0 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52  runcate))? PAGER
32bd0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30  _GET_NOCONTENT:0
32be0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
32bf0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
32c00 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
32c10 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
32c20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
32c30 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
32c40 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
32c50 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
32c60 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
32c70 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
32c80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32c90 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
32ca0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
32cb0 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
32cc0 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
32cd0 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
32ce0 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
32cf0 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
32d00 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
32d10 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
32d20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
32d30 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
32d40 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
32d50 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
32d60 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
32d70 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
32d80 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
32d90 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
32da0 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
32db0 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
32dc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
32dd0 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
32de0 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
32df0 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
32e00 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
32e10 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
32e20 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
32e30 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
32e40 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
32e50 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
32e60 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
32e70 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  edPage(pBt, pBt-
32e80 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e  >nPage, &pPg, bN
32e90 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
32ea0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32eb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
32ec0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
32ed0 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
32ee0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
32ef0 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
32f00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
32f10 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
32f20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
32f30 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ++;.      if( pB
32f40 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
32f50 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
32f60 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b   ){ pBt->nPage++
32f70 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
32f80 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38  .    put4byte(28
32f90 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61   + (u8*)pBt->pPa
32fa0 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  ge1->aData, pBt-
32fb0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50  >nPage);.    *pP
32fc0 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  gno = pBt->nPage
32fd0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  ;..    assert( *
32fe0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
32ff0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
33000 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
33010 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
33020 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
33030 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
33040 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
33050 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
33060 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33070 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
33080 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
33090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
330a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
330b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
330c0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
330d0 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
330e0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
330f0 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
33100 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
33110 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
33120 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
33130 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
33140 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
33150 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
33160 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
33170 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
33180 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  k);.  assert( rc
33190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
331a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
331b0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
331c0 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29  )->pDbPage)<=1 )
331d0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
331e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70  SQLITE_OK || (*p
331f0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
33200 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
33210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
33220 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
33230 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
33240 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
33250 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
33260 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
33270 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
33280 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
33290 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
332a0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
332b0 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
332c0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
332d0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
332e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
332f0 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
33300 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
33310 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
33320 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
33330 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
33340 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
33350 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
33360 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
33370 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
33380 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
33390 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
333a0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
333b0 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
333c0 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
333d0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
333e0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
333f0 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
33400 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
33410 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
33420 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
33430 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
33440 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
33450 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
33460 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
33470 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
33480 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
33490 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
334a0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
334b0 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
334c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334d0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
334e0 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
334f0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
33500 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
33510 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
33520 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
33530 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
33540 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
33550 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
33560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
33570 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
33580 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
33590 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
335a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
335c0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
335d0 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
335e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
335f0 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
33600 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
33610 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
33620 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
33630 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
33640 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
33650 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61  ORRUPT_DB || iPa
33660 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
33670 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
33680 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
33690 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69  Page );..  if( i
336a0 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20  Page<2 ) return 
336b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
336c0 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50  KPT;.  if( pMemP
336d0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
336e0 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
336f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
33700 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
33710 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
33720 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
33730 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
33740 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
33750 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
33760 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
33770 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
33780 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33790 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
337a0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
337b0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
337c0 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
337d0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
337e0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
337f0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
33800 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
33810 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
33820 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
33830 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
33840 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
33850 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
33860 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
33870 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
33880 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
33890 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
338a0 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
338b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
338c0 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
338d0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
338e0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
338f0 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
33900 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
33910 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
33920 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
33930 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
33940 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
33950 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
33960 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
33970 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
33980 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
33990 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
339a0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
339b0 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
339c0 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
339d0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
339e0 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
339f0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
33a00 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
33a10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
33a20 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
33a30 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
33a40 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
33a50 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
33a60 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
33a70 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
33a80 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
33a90 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
33aa0 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
33ab0 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
33ac0 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
33ad0 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
33ae0 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
33af0 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
33b00 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
33b10 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
33b20 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
33b30 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
33b40 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
33b50 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
33b60 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
33b70 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
33b80 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
33b90 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
33ba0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
33bb0 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
33bc0 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
33bd0 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
33be0 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
33bf0 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
33c00 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
33c10 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
33c20 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
33c30 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
33c40 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
33c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33c60 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
33c70 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
33c80 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
33c90 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
33ca0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
33cb0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
33cc0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
33cd0 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
33ce0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
33cf0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
33d00 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
33d10 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
33d20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
33d30 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
33d40 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
33d50 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
33d60 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
33d70 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
33d80 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
33d90 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
33da0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
33db0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
33dc0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
33dd0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
33de0 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
33df0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
33e00 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
33e10 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
33e20 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
33e30 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
33e40 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
33e50 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
33e60 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
33e70 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
33e80 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
33e90 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
33ea0 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
33eb0 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
33ec0 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
33ed0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
33ee0 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
33ef0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
33f00 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
33f10 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
33f20 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
33f30 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
33f40 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
33f50 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
33f60 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
33f70 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
33f80 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
33f90 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
33fa0 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
33fb0 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
33fc0 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
33fd0 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
33fe0 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
33ff0 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
34000 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
34010 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
34020 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
34030 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
34040 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
34050 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
34060 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
34070 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
34080 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
34090 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
340a0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
340b0 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
340c0 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
340d0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
340e0 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
340f0 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
34100 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
34110 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
34120 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
34130 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
34140 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
34150 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
34160 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
34170 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39  IDENCE-OF: R-199
34180 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72  20-11576 However
34190 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  , newer versions
341a0 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c   of SQLite still
341b0 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20  .      ** avoid 
341c0 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73  using the last s
341d0 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ix entries in th
341e0 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  e freelist trunk
341f0 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20   page array in. 
34200 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68       ** order th
34210 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
34220 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77  s created by new
34230 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
34240 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20  QLite can be.   
34250 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c     ** read by ol
34260 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
34270 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f  SQLite..      */
34280 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
34290 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
342a0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
342b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
342c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
342d0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
342e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
342f0 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
34300 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
34310 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
34320 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
34330 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
34340 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
34350 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
34360 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
34370 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
34380 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
34390 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
343a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
343b0 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
343c0 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
343d0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
343e0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
343f0 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
34400 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
34410 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
34420 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
34430 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
34440 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
34450 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
34460 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
34470 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
34480 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
34490 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
344a0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
344b0 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
344c0 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
344d0 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
344e0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
344f0 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
34500 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
34510 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
34520 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
34530 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
34540 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
34550 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
34560 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
34570 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
34580 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
34590 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
345a0 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
345b0 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
345c0 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
345d0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
345e0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
345f0 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
34600 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
34610 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34620 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
34630 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
34640 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
34650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34660 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
34670 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
34680 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
34690 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
346a0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
346b0 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
346c0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
346d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
346e0 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
346f0 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
34700 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
34710 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
34720 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
34730 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
34740 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
34750 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
34760 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
34770 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
34780 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
34790 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
347a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
347b0 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
347c0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
347d0 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
347e0 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
347f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
34800 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
34810 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
34820 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
34830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
34840 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
34850 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
34860 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
34870 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65  .  Store.** size
34880 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
34890 75 74 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70  ut the cell in p
348a0 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Info..*/.static 
348b0 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20  int clearCell(. 
348c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
348d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
348e0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
348f0 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a  ins the Cell */.
34900 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
34910 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69  *pCell,    /* Fi
34920 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
34930 43 65 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  Cell */.  CellIn
34940 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
34950 20 20 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72     /* Size infor
34960 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
34970 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74   cell */.){.  Bt
34980 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50  Shared *pBt;.  P
34990 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
349a0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
349b0 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
349c0 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
349d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
349e0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
349f0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
34a00 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
34a10 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
34a20 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e  Info);.  if( pIn
34a30 66 6f 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66  fo->nLocal==pInf
34a40 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  o->nPayload ){. 
34a50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
34a60 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
34a70 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
34a80 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
34a90 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
34aa0 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b 70 49 6e  .  if( pCell+pIn
34ab0 66 6f 2d 3e 6e 53 69 7a 65 2d 31 20 3e 20 70 50  fo->nSize-1 > pP
34ac0 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65  age->aData+pPage
34ad0 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a 20 20  ->maskPage ){.  
34ae0 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64    /* Cell extend
34af0 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61  s past end of pa
34b00 67 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ge */.    return
34b10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34b20 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
34b30 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
34b40 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70  t4byte(pCell + p
34b50 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29  Info->nSize - 4)
34b60 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
34b70 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
34b80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34b90 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67  > 4 );.  ovflPag
34ba0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
34bb0 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e  bleSize - 4;.  n
34bc0 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e  Ovfl = (pInfo->n
34bd0 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d  Payload - pInfo-
34be0 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  >nLocal + ovflPa
34bf0 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
34c00 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
34c10 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a  rt( nOvfl>0 || .
34c20 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20      (CORRUPT_DB 
34c30 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  && (pInfo->nPayl
34c40 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  oad + ovflPageSi
34c50 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65  ze)<ovflPageSize
34c60 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ).  );.  while( 
34c70 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
34c80 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
34c90 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
34ca0 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
34cb0 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
34cc0 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
34cd0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
34ce0 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
34cf0 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
34d00 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
34d10 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
34d20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
34d30 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
34d40 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
34d50 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
34d60 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
34d70 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
34d80 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
34d90 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
34da0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
34db0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
34dc0 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
34dd0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
34de0 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
34df0 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
34e00 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
34e10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
34e20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
34e30 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
34e40 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
34e50 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
34e60 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
34e70 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
34e80 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
34e90 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
34ea0 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
34eb0 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
34ec0 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
34ed0 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
34ee0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
34ef0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
34f00 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
34f10 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
34f20 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
34f30 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
34f40 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
34f50 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
34f60 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
34f70 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
34f80 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
34f90 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
34fa0 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
34fb0 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
34fc0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
34fd0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
34fe0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
34ff0 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
35000 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
35010 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
35020 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
35030 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
35040 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
35050 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
35060 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
35070 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
35080 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
35090 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
350a0 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
350b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
350c0 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
350d0 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
350e0 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
350f0 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
35100 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
35110 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
35120 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
35130 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35150 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
35160 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
35170 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
35180 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
35190 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
351a0 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
351b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
351c0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
351d0 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
351e0 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
351f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35200 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
35210 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
35220 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
35230 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
35240 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
35250 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
35260 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
35270 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
35280 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
35290 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
352a0 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
352b0 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
352c0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
352d0 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
352e0 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
352f0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
35300 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
35310 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
35320 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
35330 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
35340 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
35350 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
35360 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
35370 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
35380 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
35390 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
353a0 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
353b0 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
353c0 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
353d0 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
353e0 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
353f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
35400 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
35410 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
35420 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
35430 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
35440 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
35450 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
35460 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
35470 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
35480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
35490 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
354a0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
354b0 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a  t BtreePayload *
354c0 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  pX,        /* Pa
354d0 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63 68  yload with which
354e0 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68   to construct th
354f0 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
35500 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
35510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
35520 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65  ite cell size he
35530 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  re */.){.  int n
35540 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74  Payload;.  const
35550 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74   u8 *pSrc;.  int
35560 20 6e 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e   nSrc, n, rc, mn
35570 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
35580 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  t;.  MemPage *pT
35590 6f 52 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73 69  oRelease;.  unsi
355a0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
355b0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
355c0 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
355d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20  BtShared *pBt;. 
355e0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a   Pgno pgnoOvfl;.
355f0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a    int nHeader;..
35600 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35610 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
35620 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
35630 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
35640 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
35650 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
35660 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
35670 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
35680 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
35690 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
356a0 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
356b0 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
356c0 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
356d0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
356e0 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
356f0 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67  [pPage->pBt->pag
35700 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
35710 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
35720 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
35730 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
35740 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74  ..  /* Fill in t
35750 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  he header. */.  
35760 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d  nHeader = pPage-
35770 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
35780 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
35790 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f  ey ){.    nPaylo
357a0 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b  ad = pX->nData +
357b0 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20   pX->nZero;.    
357c0 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61  pSrc = pX->pData
357d0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d  ;.    nSrc = pX-
357e0 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65  >nData;.    asse
357f0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
35800 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c  yLeaf ); /* fill
35810 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61  InCell() only ca
35820 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20  lled for leaves 
35830 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  */.    nHeader +
35840 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
35850 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
35860 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48  Payload);.    nH
35870 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
35880 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
35890 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e  r], *(u64*)&pX->
358a0 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nKey);.  }else{.
358b0 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e      assert( pX->
358c0 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66  nKey<=0x7fffffff
358d0 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20   && pX->pKey!=0 
358e0 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50  );.    nSrc = nP
358f0 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58  ayload = (int)pX
35900 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  ->nKey;.    pSrc
35910 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20   = pX->pKey;.   
35920 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
35930 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
35940 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
35950 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  d);.  }.  .  /* 
35960 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c  Fill in the payl
35970 6f 61 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f 61  oad */.  pPayloa
35980 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
35990 65 72 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  er];.  if( nPayl
359a0 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
359b0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
359c0 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f  his is the commo
359d0 6e 20 63 61 73 65 20 77 68 65 72 65 20 65 76 65  n case where eve
359e0 72 79 74 68 69 6e 67 20 66 69 74 73 20 6f 6e 20  rything fits on 
359f0 74 68 65 20 62 74 72 65 65 20 70 61 67 65 0a 20  the btree page. 
35a00 20 20 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76 65     ** and no ove
35a10 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20  rflow pages are 
35a20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
35a30 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e   n = nHeader + n
35a40 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73  Payload;.    tes
35a50 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20  tcase( n==3 );. 
35a60 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
35a70 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34  4 );.    if( n<4
35a80 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70   ) n = 4;.    *p
35a90 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 61  nSize = n;.    a
35aa0 73 73 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50 61  ssert( nSrc<=nPa
35ab0 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 74 65 73  yload );.    tes
35ac0 74 63 61 73 65 28 20 6e 53 72 63 3c 6e 50 61 79  tcase( nSrc<nPay
35ad0 6c 6f 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d 63  load );.    memc
35ae0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72  py(pPayload, pSr
35af0 63 2c 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d 65  c, nSrc);.    me
35b00 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e 53  mset(pPayload+nS
35b10 72 63 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64 2d  rc, 0, nPayload-
35b20 6e 53 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72  nSrc);.    retur
35b30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
35b40 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
35b50 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
35b60 74 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d  t means that som
35b70 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  e of the content
35b80 20 77 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a 20   will need.  ** 
35b90 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76  to spill onto ov
35ba0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
35bb0 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65 2d  */.  mn = pPage-
35bc0 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d  >minLocal;.  n =
35bd0 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20   mn + (nPayload 
35be0 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e  - mn) % (pPage->
35bf0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
35c00 2d 20 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65  - 4);.  testcase
35c10 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
35c20 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
35c30 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
35c40 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
35c50 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78  ( n > pPage->max
35c60 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a  Local ) n = mn;.
35c70 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b    spaceLeft = n;
35c80 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b  .  *pnSize = n +
35c90 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20   nHeader + 4;.  
35ca0 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
35cb0 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70 54  nHeader+n];.  pT
35cc0 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
35cd0 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
35ce0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
35cf0 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
35d00 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20  point variables 
35d10 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73  should be set as
35d20 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20   follows:.  **. 
35d30 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20   **   nPayload  
35d40 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70           Total p
35d50 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62  ayload size in b
35d60 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79  ytes.  **   pPay
35d70 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42  load           B
35d80 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79  egin writing pay
35d90 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20  load here.  **  
35da0 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20   spaceLeft      
35db0 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61      Space availa
35dc0 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e  ble at pPayload.
35dd0 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70    If nPayload>sp
35de0 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20  aceLeft,.  **   
35df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e00 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f     that means co
35e10 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c  ntent must spill
35e20 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
35e30 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e  ages..  **   *pn
35e40 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
35e50 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61  Size of the loca
35e60 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e  l cell (not coun
35e70 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61  ting overflow pa
35e80 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69  ges).  **   pPri
35e90 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57  or             W
35ea0 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68  here to write th
35eb0 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69  e pgno of the fi
35ec0 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
35ed0 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20  e.  **.  ** Use 
35ee0 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50  a call to btreeP
35ef0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f  arseCellPtr() to
35f00 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
35f10 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20   values above.  
35f20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  ** were computed
35f30 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
35f40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
35f50 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c  EBUG.  {.    Cel
35f60 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
35f70 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
35f80 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
35f90 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
35fa0 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e  rt( nHeader==(in
35fb0 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  t)(info.pPayload
35fc0 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20   - pCell) );.   
35fd0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
35fe0 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a  ey==pX->nKey );.
35ff0 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53      assert( *pnS
36000 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a  ize == info.nSiz
36010 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
36020 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e   spaceLeft == in
36030 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d  fo.nLocal );.  }
36040 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72  .#endif..  /* Wr
36050 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20  ite the payload 
36060 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43  into the local C
36070 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72  ell and any extr
36080 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  a into overflow 
36090 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65  pages */.  while
360a0 28 20 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e  ( 1 ){.    n = n
360b0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
360c0 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
360d0 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
360e0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
360f0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
36100 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
36110 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
36120 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
36130 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
36140 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
36150 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
36160 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
36170 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
36180 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
36190 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
361a0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
361b0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
361c0 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
361d0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
361e0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
361f0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
36200 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
36210 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
36220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
36230 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
36240 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
36250 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
36260 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
36270 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
36280 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36290 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
362a0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
362b0 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  nSrc>=n ){.     
362c0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
362d0 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
362e0 7d 65 6c 73 65 20 69 66 28 20 6e 53 72 63 3e 30  }else if( nSrc>0
362f0 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e 53   ){.      n = nS
36300 72 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  rc;.      memcpy
36310 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c  (pPayload, pSrc,
36320 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
36330 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61        memset(pPa
36340 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20  yload, 0, n);.  
36350 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64    }.    nPayload
36360 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e   -= n;.    if( n
36370 50 61 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72 65  Payload<=0 ) bre
36380 61 6b 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64  ak;.    pPayload
36390 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
363a0 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
363b0 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
363c0 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
363d0 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b   spaceLeft==0 ){
363e0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
363f0 70 4f 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e 64  pOvfl = 0;.#ifnd
36400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
36410 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
36420 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
36430 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
36440 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
36450 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
36460 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
36470 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
36480 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
36490 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
364a0 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
364b0 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
364c0 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
364d0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
364e0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
364f0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
36500 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
36510 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
36520 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
36530 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
36540 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
36550 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
36560 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
36570 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
36580 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
36590 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
365a0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
365b0 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
365c0 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
365d0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
365e0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
365f0 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
36600 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
36610 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
36620 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
36630 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
36640 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
36650 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
36660 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
36670 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
36680 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
36690 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
366a0 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
366b0 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
366c0 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
366d0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
366e0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
366f0 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
36700 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
36710 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
36720 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
36730 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
36740 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
36750 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
36760 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
36770 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
36780 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
36790 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
367a0 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
367b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
367c0 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
367d0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
367e0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
367f0 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
36800 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
36810 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
36820 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
36830 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
36840 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
36850 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
36860 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
36870 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
36880 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
36890 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
368a0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
368b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
368c0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
368d0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
368e0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
368f0 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
36900 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
36910 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
36920 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
36930 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
36940 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
36950 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
36960 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
36970 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
36980 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36990 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
369a0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
369b0 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
369c0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
369d0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
369e0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
369f0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
36a00 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
36a10 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
36a20 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
36a30 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
36a40 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
36a50 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
36a60 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
36a70 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
36a80 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
36a90 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
36aa0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
36ab0 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
36ac0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
36ad0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
36ae0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
36af0 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
36b00 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
36b10 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
36b20 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
36b30 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
36b40 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
36b50 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
36b60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
36b70 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  - 4;.    }.  }. 
36b80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
36b90 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
36ba0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
36bb0 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
36bc0 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
36bd0 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
36be0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
36bf0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
36c00 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
36c10 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
36c20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
36c30 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
36c40 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
36c50 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
36c60 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
36c70 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
36c80 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
36c90 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
36ca0 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
36cb0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
36cc0 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
36cd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
36ce0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
36cf0 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
36d00 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
36d10 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
36d20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
36d30 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
36d40 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
36d50 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
36d60 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
36d70 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
36d80 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
36d90 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
36da0 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
36db0 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
36dc0 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
36dd0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
36de0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
36df0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
36e00 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
36e10 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
36e20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
36e30 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
36e40 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
36e50 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
36e60 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  n;.  assert( idx
36e70 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65  >=0 && idx<pPage
36e80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
36e90 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
36ea0 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28  || sz==cellSize(
36eb0 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20  pPage, idx) );. 
36ec0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36ed0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36ee0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
36ef0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
36f00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
36f10 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
36f20 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  ex) );.  data = 
36f30 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
36f40 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43  ptr = &pPage->aC
36f50 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20  ellIdx[2*idx];. 
36f60 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
36f70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  tr);.  hdr = pPa
36f80 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
36f90 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67   testcase( pc==g
36fa0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
36fb0 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63  r+5]) );.  testc
36fc0 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67  ase( pc+sz==pPag
36fd0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
36fe0 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 2b 73  ze );.  if( pc+s
36ff0 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
37000 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
37010 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
37020 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
37030 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
37040 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
37050 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
37060 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
37070 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
37080 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
37090 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66  e->nCell--;.  if
370a0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
370b0 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
370c0 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
370d0 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64   4);.    data[hd
370e0 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75  r+7] = 0;.    pu
370f0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
37100 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  +5], pPage->pBt-
37110 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
37120 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
37130 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
37140 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d  bleSize - pPage-
37150 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20  >hdrOffset.     
37160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37170 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64    - pPage->child
37180 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d  PtrSize - 8;.  }
37190 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76  else{.    memmov
371a0 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
371b0 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
371c0 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62  idx));.    put2b
371d0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
371e0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
371f0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
37200 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e += 2;.  }.}../
37210 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
37220 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
37230 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
37240 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
37250 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
37260 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
37270 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
37280 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
37290 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
372a0 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
372b0 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
372c0 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
372d0 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
372e0 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
372f0 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
37300 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
37310 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
37320 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
37330 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
37340 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
37350 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
37360 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
37370 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
37380 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
37390 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
373a0 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
373b0 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
373c0 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
373d0 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
373e0 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
373f0 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
37400 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
37410 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
37420 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74 20  **.** *pRC must 
37430 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68 65  be SQLITE_OK whe
37440 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
37450 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
37460 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74 43  tic void insertC
37470 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
37480 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
37490 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
374a0 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
374b0 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
374c0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
374d0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
374e0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
374f0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
37500 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
37510 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
37520 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
37530 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
37540 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
37550 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
37560 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
37570 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
37580 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
37590 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67 6e   needed */.  Pgn
375a0 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20 2f  o iChild,      /
375b0 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72  * If non-zero, r
375c0 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20 62  eplace first 4 b
375d0 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20 76  ytes with this v
375e0 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  alue */.  int *p
375f0 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  RC          /* R
37600 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72 65  ead and write re
37610 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 68  turn code from h
37620 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
37630 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  idx = 0;      /*
37640 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20   Where to write 
37650 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  new cell content
37660 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
37670 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
37680 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
37690 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  r */.  u8 *data;
376a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
376b0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 77  content of the w
376c0 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  hole page */.  u
376d0 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20 20  8 *pIns;        
376e0 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69 6e   /* The point in
376f0 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78   pPage->aCellIdx
37700 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c 6c  [] where no cell
37710 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20 20   inserted */..  
37720 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d 53 51  assert( *pRC==SQ
37730 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73  LITE_OK );.  ass
37740 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
37750 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
37760 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
37770 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45  .  assert( MX_CE
37780 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
37790 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
377a0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
377b0 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
377c0 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  pBt) || CORRUPT_
377d0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
377e0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
377f0 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
37800 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20  e->apOvfl) );.  
37810 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
37820 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
37830 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ==ArraySize(pPag
37840 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20  e->aiOvfl) );.  
37850 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
37860 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
37870 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
37880 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73  .  /* The cell s
37890 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
378a0 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c  e sized correctl
378b0 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65  y.  However, whe
378c0 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20  n moving a.  ** 
378d0 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66  malformed cell f
378e0 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20  rom a leaf page 
378f0 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70  to an interior p
37900 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c  age, if the cell
37910 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65   size.  ** wante
37920 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
37930 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e  n 4 but got roun
37940 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74  ded up to 4 on t
37950 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69  he leaf, then si
37960 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ze.  ** might be
37970 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65   less than 8 (le
37980 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65  af-size + pointe
37990 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69  r) on the interi
379a0 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a  or node.  Hence.
379b0 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66    ** the term af
379c0 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68  ter the || in th
379d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
379e0 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rt(). */.  asser
379f0 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43  t( sz==pPage->xC
37a00 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70  ellSize(pPage, p
37a10 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
37a20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
37a30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
37a40 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
37a50 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
37a60 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
37a70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
37a80 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  mp, pCell, sz);.
37a90 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
37aa0 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
37ab0 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
37ac0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
37ad0 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
37ae0 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
37af0 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
37b00 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20    /* Comparison 
37b10 61 67 61 69 6e 73 74 20 41 72 72 61 79 53 69 7a  against ArraySiz
37b20 65 2d 31 20 73 69 6e 63 65 20 77 65 20 68 6f 6c  e-1 since we hol
37b30 64 20 62 61 63 6b 20 6f 6e 65 20 65 78 74 72 61  d back one extra
37b40 20 73 6c 6f 74 0a 20 20 20 20 2a 2a 20 61 73 20   slot.    ** as 
37b50 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2e 20 20  a contingency.  
37b60 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
37b70 6e 65 76 65 72 20 6e 65 65 64 20 6d 6f 72 65 20  never need more 
37b80 74 68 61 6e 20 33 20 6f 76 65 72 66 6c 6f 77 0a  than 3 overflow.
37b90 20 20 20 20 2a 2a 20 73 6c 6f 74 73 20 62 75 74      ** slots but
37ba0 20 34 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64   4 are allocated
37bb0 2c 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61 66  , just to be saf
37bc0 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
37bd0 28 20 6a 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ( j < ArraySize(
37be0 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2d 31  pPage->apOvfl)-1
37bf0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
37c00 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
37c10 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
37c20 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
37c30 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75  ..    /* When mu
37c40 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
37c50 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72 65   occur, they are
37c60 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69   always sequenti
37c70 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a  al and in.    **
37c80 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20   sorted order.  
37c90 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20  This invariants 
37ca0 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d 75  arise because mu
37cb0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
37cc0 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
37cd0 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65   occur when inse
37ce0 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63 65  rting divider ce
37cf0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
37d00 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a  ent page during.
37d10 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67      ** balancing
37d20 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  , and the divide
37d30 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20  rs are adjacent 
37d40 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20  and sorted..    
37d50 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  */.    assert( j
37d60 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69  ==0 || pPage->ai
37d70 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69  Ovfl[j-1]<(u16)i
37d80 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73   ); /* Overflows
37d90 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
37da0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
37db0 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65  j==0 || i==pPage
37dc0 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20  ->aiOvfl[j-1]+1 
37dd0 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  );   /* Overflow
37de0 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c  s are sequential
37df0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
37e00 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
37e10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
37e20 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
37e30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37e40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
37e50 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
37e60 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
37e70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
37e80 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
37e90 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
37ea0 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
37eb0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61  ge->aData;.    a
37ec0 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50 61  ssert( &data[pPa
37ed0 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d  ge->cellOffset]=
37ee0 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  =pPage->aCellIdx
37ef0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   );.    rc = all
37f00 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
37f10 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
37f20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
37f30 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
37f40 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
37f50 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
37f60 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
37f70 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70  e following prop
37f80 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
37f90 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
37fa0 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20  essfully */.    
37fb0 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30  assert( idx >= 0
37fc0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
37fd0 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65  idx >= pPage->ce
37fe0 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
37ff0 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52  ->nCell+2 || COR
38000 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61  RUPT_DB );.    a
38010 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
38020 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
38030 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
38040 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
38050 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
38060 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
38070 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  ata[idx], pCell,
38080 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43   sz);.    if( iC
38090 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
380a0 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
380b0 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
380c0 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61  }.    pIns = pPa
380d0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69  ge->aCellIdx + i
380e0 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  *2;.    memmove(
380f0 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a  pIns+2, pIns, 2*
38100 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
38110 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  i));.    put2byt
38120 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20  e(pIns, idx);.  
38130 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
38140 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65  ;.    /* increme
38150 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  nt the cell coun
38160 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b  t */.    if( (++
38170 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
38180 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64  ffset+4])==0 ) d
38190 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
381a0 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61  fset+3]++;.    a
381b0 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
381c0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
381d0 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67  Offset+3])==pPag
381e0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e  e->nCell );.#ifn
381f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
38200 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
38210 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
38220 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
38230 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
38240 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
38250 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
38260 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
38270 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
38280 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
38290 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
382a0 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
382b0 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
382c0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
382d0 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
382e0 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a  ll, pRC);.    }.
382f0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
38300 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20  .** A CellArray 
38310 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
38320 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74  a cache of point
38330 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f  ers and sizes fo
38340 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69  r a.** consecuti
38350 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ve sequence of c
38360 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20  ells that might 
38370 62 65 20 68 65 6c 64 20 6f 6e 20 6d 75 6c 74 69  be held on multi
38380 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79  ple pages..*/.ty
38390 70 65 64 65 66 20 73 74 72 75 63 74 20 43 65 6c  pedef struct Cel
383a0 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79  lArray CellArray
383b0 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72  ;.struct CellArr
383c0 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  ay {.  int nCell
383d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
383e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
383f0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
38400 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66  .  MemPage *pRef
38410 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
38420 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a  ference page */.
38430 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20    u8 **apCell;  
38440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
38450 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c   cells begin bal
38460 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a  anced */.  u16 *
38470 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  szCell;         
38480 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
38490 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
384a0 20 61 70 43 65 6c 6c 5b 5d 20